2016-10-17 1 views
0

토글 키 등을 사용하여 계속 사용하기로 결정한 사용자를 계속 클릭 할 수있는 도구를 만들었습니다. 정상적인 창 (예 : Google 크롬)에서 정상적으로 작동합니다. 그러나 게임과 관련하여 항상 올바르게 작동하는 것은 아닙니다. (일부 게임에서는 물론 잘 작동하지 않지만 다른 게임에서는 그렇지 않습니다.)글로벌 단축키가 GetAsyncKeyState를 사용하여 게임에 등록되지 않았습니다.

코드는 LButton을 누른 상태에서 빠르게 클릭하도록 설계되어 있으며 자동 틱커 역할을 할 때 중지됩니다 (사용자가 속도 제어 기능을 가짐). 다시 작동하지만 게임을 할 때 다른 윈도우/앱보다 느리게 움직입니다.

나는

  Thread.Sleep(200) 

수정 게임에서 autoclicker의 속도를 사용하여 지연을 추가 알아 냈어요,하지만 항상 LButton가 열리는 밤은 때/눌려도 클릭 autoclicker 초래 keybind를 망쳐 놨어요 .

내가 지연으로 사용할 수있는 것이 있습니까? 아니면 코드에서 올바르게 작동 할 수있는 다른 방법이 있습니까?

나는 여러 가지 다양한 변형을 시도해 왔으며 지난 며칠간 온라인으로 검색하려고 노력했지만 아무도 성공하지 못했습니다.

내 프로젝트의 오토 릭킹과 관련된 모든 코드는 다음과 같습니다. 몇 가지 메모를 추가하여 타이머가 설정되는 속도/속도를 설명합니다.

Imports System.Threading 

    Public Class Form1 
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Integer) As Short 
    Private Declare Sub mouse_event Lib "user32" (ByVal dwflags As Integer, ByVal dx As Integer, ByVal cbuttons As Integer, ByVal dy As Integer, ByVal dwExtraInfo As Integer) 
    Private Const mouseclickup = 4 
    Private Const mouseclickdown = 2 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    'Timer1 isnt doing the clicking, Timer1 is just listening for LButton 
    'clicks which is why I have it always on aswell as a low interval. 
    Timer1.Start() 
    Timer1.Interval = 1 

    'LButton is the timer that will do the clicking. 
    LButton.Interval = 100 
    End Sub 

    Private Sub LButton_Tick(sender As Object, e As EventArgs) Handles LButton.Tick 

    If GetAsyncKeyState(Keys.LButton) Then 
     mouse_event(mouseclickup, 0, 0, 0, 0) 

     'Without Thread.Sleep(200) the code works as it's suppose to, clicks 
     'when LButton is held, stops clicking when LButton is let go, 
     'although without Thread.Sleep(200) it will not work in all games, 
     'but with it, it will continuously click even when LButton isn't held. 
     Thread.Sleep(200) 

     mouse_event(mouseclickdown, 0, 0, 0, 0) 
    Else 
     LButton.Stop() 
    End If 
End Sub 

Private Sub Timer1_Tick_1(sender As Object, e As EventArgs) Handles Timer1.Tick 

    'This is what will listen for the left clicks and also stop the left 
    'LButton timer if LButton is not held 

    If GetAsyncKeyState(Keys.LButton) Then 
     LButton.Start() 
    Else 
     LButton.Stop() 
    End If 

End Sub 
End Class 
+0

'GetAsyncKeyState()'는 대부분의 게임과 같이 전체 화면 응용 프로그램에서 작동하지 않는 것으로 알려져 있습니다. 일반적으로 권장되는 솔루션은 키보드 후크를 만드는 것입니다. –

+0

@VisualVincent 게임이 바탕 화면/창 모드에서 실행되는 데 문제가 있으며 스팀이 아니므로 문제는 버튼을 누르고 게임을 너무 빠르게 놓아서 명령을 등록하는 이유입니다. 스레드 잠자기 명령을 추가 한 이유는 무엇입니까? 그것의 속도를 클릭하십시오,하지만 keybind 엉망 (lbutton isnt 개최 때도 계속) 그래서 그 지연을 변경하는 것이 도움이 될 것이라고 생각, 그것의 중지/수면 스레드 퍼팅, 그것은 나던 시작 코드를 기억하기 때문에 왼쪽을 클릭하면 클릭하고 그렇지 않으면 중지합니다. 지연으로 사용할 수있는 것이 있습니까? – Joey

+0

문제는'GetAsyncKeyState()'가 다른 상태 (키 다운, 키 업 등)에서 0이 아닌 값을 반환하므로 코드가 여러 번 실행된다는 것입니다. 이것을 막으려면 키 다운을 확인한 다음'GetAsyncKeyState()'가 0을 반환 할 때까지 반복되는 루프를 만드십시오. - 내가 말하는 것은 내 [** 이전의 대답 **] (http://stackoverflow.com/a/38154826/3740093) 중 하나에서 찾을 수 있습니다. 나는 곧 당신에게 답을 씁니다. –

답변

0

the MSDN documentation 인용 GetAsyncKeyState()은 결정 키가 함수가 호출 될 때까지 아래로, 그리고 키 GetAsyncKeyState에 대한 이전 호출 후에 눌렀는지 여부

여부. 당신이 If GetAsyncKeyState(Keys.LButton) Then를 통해 기능을 검사 할 때

그래서, 그것은 따라서 (당신이 Thread.Sleep(200)를 추가 할 때 발생할 것입니다) 당신이 원하는 것보다 코드 이상을 실행, 비 - 제로 적어도 세 번 돌아갑니다. 키를 누른 상태에서 당신이 the most significant bitShort에 대한 진수의 0x8000와 진수 32768 인 설정되어 있는지 확인해야 할 경우

확인합니다.

(<number> And <bit>) = <bit> - Andbitwise And operator 인 것을 확인하여 비트 플래그를 확인합니다.

이 코드는 다음과 같이보고 초래 :

Const KeyDownBit As Integer = &H8000 

Private Sub LButton_Tick(sender As Object, e As EventArgs) Handles LButton.Tick 
    If (GetAsyncKeyState(Keys.LButton) And KeyDownBit) = KeyDownBit Then 
     mouse_event(mouseclickup, 0, 0, 0, 0) 
     Thread.Sleep(200) 
     mouse_event(mouseclickdown, 0, 0, 0, 0) 
    Else 
     LButton.Stop() 
    End If 
End Sub 

Private Sub Timer1_Tick_1(sender As Object, e As EventArgs) Handles Timer1.Tick 
    If (GetAsyncKeyState(Keys.LButton) And KeyDownBit) = KeyDownBit Then 
     LButton.Start() 
    Else 
     LButton.Stop() 
    End If 
End Sub 

내가 두 번째 타이머 (Timer1가) 실제로이 경우에 필요한지 여부를 모르겠어요.

+0

답장을 보내 주셔서 감사합니다. 그리고이 문제를 해결해 주셔서 감사합니다. 그래도 여전히 같은 문제가 있지만 응답이 없으며 계속됩니다. 때로는 LButton을 놓을 때 멈추지 만 계속해서 클릭하면됩니다. – Joey

+0

Thread.Sleep (200)을 제거하면 응답 속도가 좋아 지지만 Thread.Sleep (200)을 사용하지 않으면 클릭 속도가 매우 느려집니다 (간격 설정에 관계없이 같은 속도) – Joey

+0

@Joey : It Thread.Sleep()이 블로킹 호출이기 때문에 응답이 없습니다. 그것은 일반적인 'System.Windows.Forms.Timer'를 사용하기 때문에 사용자 인터페이스 (UI) 스레드 인 전체 스레드를 차단합니다. 새 스레드 또는 태스크를 사용하여 사용자 인터페이스의로드를 가져옵니다. –

관련 문제