[Problem]C++ - Hotkeys mit Fenster

09/26/2011 15:37 chillakilla123#1
Ich habe eine Dll, die in ein Spiel injected wird.
Die Funktion soll schauen ob das Fenster im Vordergrund zum eigenen Prozess(Spielfenster, weil injected) gehört und ob "P"(0x50) gedrückt wurde.
Code den ich dafür habe(das wird im seperaten Thread gestartet):

PHP Code:
while(1){
        
DWORD CurrentPId GetCurrentProcessId();

        
HWND hWindow GetForegroundWindow();
        
LPDWORD TargetPId;
        
GetWindowThreadProcessId(hWindow, (LPDWORD)TargetPId);

        if(
GetAsyncKeyState(0x50)){ MessageBoxW(NULL"A""A"MB_OK); }

        if(
CurrentPId == *TargetPId){ MessageBoxW(NULL"B""B"MB_OK); }

        if((
CurrentPId == *TargetPId) && (GetAsyncKeyState(0x50))){ MessageBoxW(NULL"C""C"MB_OK); }

        
Sleep(5);
    } 
Komischerweise kommt die MessageBox "A" wenn man "P" drückt schon, die MessageBoxen "B" und "C" kommen aber nie, obwohl das Spielfenster in Vordergrund ist.

Kann mir jemand vllt weiterhelfen damit das geht?
thx :D
09/26/2011 18:24 link#2
Code:
while(true)
{
  DWORD TargetPId, CurrentPId = GetCurrentProcessId();
  HWND hWindow = GetForegroundWindow();
  GetWindowThreadProcessId(hWindow, &TargetPId);

  if(GetAsyncKeyState('P') & 1)
    MessageBoxW(NULL, "A", "A", MB_OK);

  if(CurrentPId == TargetPId)
    MessageBoxW(NULL, "B", "B", MB_OK);

  if((CurrentPId == TargetPId) && (GetAsyncKeyState('P') & 1))
    MessageBoxW(NULL, "C", "C", MB_OK);

  Sleep(10);
}
09/26/2011 19:52 chillakilla123#3
OK thx erstmal, so gehts, aber wo lag denn jetzt der Fehler.
Du hast ja eigentlich auch nur das gleiche gemacht wie ich(DWORD mit Zeiger anstatt LPDWORD) und dieses & 1 hinter GetAsyncKeyState.
Was macht das & 1 genau, das kapier ich noch nicht.

Aber es funkt schonmal thx :D
09/26/2011 20:33 link#4
Wenn im Rückgabewert von GetAsyncKeyState das niedrigstwertige Bit gesetzt ist, heißt das, dass die Taste seit dem letzten GetAsyncKeyState-Aufruf gedrückt wurde. Ist für Hotkeys besser geeignet.

Dein eigentlicher Fehler war
Code:
LPDWORD TargetPId;
GetWindowThreadProcessId(hWindow, (LPDWORD)TargetPId);
Du solltest dir evtl. nochmal was zu Pointern durchlesen, weil das so keinen Sinn ergibt.
GetAsyncKeyState erwartet als zweiten Parameter eine Adresse zu einem DWORD, in welches die Prozess ID geschrieben wird, also entweder über einen Pointer (aber richtig) oder einfach
Code:
DWORD TargetPId;
GetWindowThreadProcessId(hWindow, &TargetPId);
09/26/2011 21:38 chillakilla123#5
Quote:
GetAsyncKeyState erwartet als zweiten Parameter eine Adresse zu einem DWORD
Ich dachte mir, das weil im [Only registered and activated users can see links. Click Here To Register...]steht:
Quote:
LPDWORD: A pointer to a DWORD.
Das es schon der Pointer zum DWORD ist und ich dann beim Vergleich den mit * rauslesen kann.
Naja, das mit dem & 1 hab ich noch nicht so ganz kapiert xD
Aber es geht erstmal :D