Spielinterne Buttons/Bilder



  • Hallo,
    folgendes, ich möchte Buttons in einem Spiel automatisch drücken. Bei "richtigen" Buttons funktioniert dies auch recht einfach mit SendMessage(), allerdings gibt es in diesem Spiel nur das MainWindow zu bearbeiten. Weiterhin sendet der Button auch keine WM_COMMAND Nachrichten an das MainWindow, deshalb fällt diese Möglichkeit auch weg. Da das Spiel Online ist, wäre es zwar Möglich das Packet zu senden das die Aktion enthält, aber das möchte ich nicht da ich 1. nicht weiß wie 😛 und 2. Ärger mit den GameMastern vermeiden möchte.

    Hat jemand noch eine Idee wie man das sonst realisieren könnte?

    Edit: Die WM_COMMAND Möglichkeit habe ich lediglich dadurch geprüft, indem ich einfach per SendMessage WM_COMMAND Nachrichten mit wParam von 0-20000 an das Hauptfenster gesendet habe, da ich es nicht geschafft habe die Nachricht zu hooken.



  • Mach ein SendInput oder ein mouse_event. Damit kannst du ein Mausklick simulieren. Musst nur die richtigen Koordinaten wissen.

    schirrmie



  • Es soll ja auch bei anderen Funktionieren und wenn die das Fenster dann verschoben haben oder ne andere Auflösung haben klickt er ins Leere.

    Edit: Wenn ich mit Spy++ die Nachrichten checke bekomme ich nur reihenweise 0x00FF sprich unbekannte Nachrichten mit wParam 0 und lParam mit irgendeinem Hex String bei Mausbewegungen/Klicks.



  • 0x00FF ist WM_INPUT 🙂



  • Versuch zu Hooken ging irgendwie schief, genaugenommen wird CallWndProc gar nicht aufgerufen, ich bitte um Verbesserung.

    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
    DWORD ID;
    HHOOK hROHook;
    HOOKPROC hROHookProc;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
    {
    
    	HWND hwnd = FindWindow (NULL, "NiktoutRO Chaos 2007-06-06");
    	GetWindowThreadProcessId(hwnd, &ID);	
    	hROHook = SetWindowsHookEx(WH_CALLWNDPROC , CallWndProc, NULL, ID);
    
    	   return 0; 
    }
    
    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
     		MessageBox (NULL, "bla", "bla", MB_OK);
     		if (nCode == HC_ACTION)
     		{
    		   		  if (wParam>0)
    		   		  {
    				  }
             }
    return CallNextHookEx (hROHook, nCode, wParam, lParam);
    }
    


  • So siehts im Moment aus, ich bekomme aber immer noch Errorcode 87, also irgendwo ist ein Parameter falsch->es muss der dritte oder zweite bei SetWindowsHookEx sein. Ich hoffe jemand sieht was hier falsch läuft. Ich will übrigens in einen fremden Prozess hooken da ich ja dessen Nachrichten abfangen möchte, ich hoffe das ist mit der ID und so dann alles richtig.

    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    DWORD ID;
    HHOOK hROHook;
    DWORD error;
    LPTSTR s;
    char buf[100];
    MSG msg;
    BOOL bRet;
    LRESULT CALLBACK hROHookProc(int nCode, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
    {
    
    	HWND hwnd = FindWindow (NULL, "NiktoutRO Chaos 2007-06-06");
    
    	if(!hwnd)
    	{
    	return 0;
    	}
    
    	GetWindowThreadProcessId(hwnd, &ID);	
    	hROHook = SetWindowsHookEx(WH_CALLWNDPROC , hROHookProc, GetModuleHandle( NULL ), ID);
    
    	error = GetLastError();
    
    	sprintf(buf, "%d", error);
    
        MessageBox (NULL, buf, "error", MB_OK);
    
    	  while( (bRet = GetMessage( &msg, 0, 0, 0 )) != 0)
    	  {
    	  if (bRet == -1)
    	  {
    	  MessageBox (NULL, "bla2", "bla", MB_OK);
    	  }
    	  else
    	  {
    	  TranslateMessage(&msg);
    	  DispatchMessage(&msg);
    	  }
    	  }
    	  }
    
    LRESULT CALLBACK hROHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
     		MessageBox (NULL, "bla", "bla", MB_OK);
    
       		if (nCode < 0)
       		{
            return CallNextHookEx(hROHook, nCode, 
                    wParam, lParam); 
    				}
    
     		if (nCode == HC_ACTION)
     		{
    		   		  if (wParam>0)
    		   		  {
    				  }
             }
    return CallNextHookEx (hROHook, nCode, wParam, lParam);
    }
    


  • Ich glaube, wenn ein Hook für einen bestimmten Thread installiert wird, muss die Hook-Funktion auch in dem entsprechenden Prozess geladen sein.
    Evtl kannst du mit Dll-Injection deine Hook-Funktion an den Prozess anhängen.
    Bin mir aber nicht sicher 🙂


Anmelden zum Antworten