Taste an Spiel senden
-
nein, du verstehst es falsch - der hook code ist dort nur zum aufnehmen...
der für dich wesentliche teil ist das hier:
inline INPUT KeyDown(WORD vk, WORD sc, HWND hwnd) { INPUT ipSignal; ipSignal.type = INPUT_KEYBOARD; ipSignal.ki.wVk = vk; ipSignal.ki.wScan = sc; ipSignal.ki.dwFlags = 0L; ipSignal.ki.time = 0L; ipSignal.ki.dwExtraInfo = (ULONG_PTR)hwnd; //ipSignal.ki.dwExtraInfo = 0; //Fenster mit dem Fokus SendInput(1, &ipSignal, sizeof(ipSignal)); return ipSignal; } inline INPUT KeyUp(INPUT ip) { ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(ip)); return ip; }wobei dass mit ipSignal.ki.dwExtraInfo = (ULONG_PTR)hwnd; irgendwie nicht so ganz wie gewünscht funktioniert - Nachrichten werden immer nur an das Fenster mit dem Fokus geschickt...
-
http://wwwx.cs.unc.edu/~gb/wp/blog/2007/11/16/sending-key-events-to-pygame-programs/
Der macht im Prinzip nix anders.
Keine Ahnung warum das bei dir dann nicht will.
-
ich verstehs auch nich
er hats im grunde auch nich anders als ich...hier mal mein bisheriger code (gekürzt):
#define _WIN32_WINNT 0x0500 #include <cstdlib> #include <iostream> #include <windows.h> #include <fstream> #include <string> #define getPixelColor(x,y) GetPixel(GetDC(0),(x),(y)) #include <time.h> #if(_WIN32_WINNT >= 0x0500) #define KEYEVENTF_UNICODE 0x0004 /*Hier muss ich wohl noch was ändern?! Ich will die Taste 5 drücken*/ #define KEYEVENTF_SCANCODE 0x0008 #endif /* _WIN32_WINNT >= 0x0500 */ using namespace std; COLORREF pixel; int main() { HWND hWnd; hWnd = FindWindow(0,"KalOnline"); HDC hdc; hdc=GetDC(NULL); SetFocus(hWnd); SetForegroundWindow(hWnd); while(true) { RECT rcWindow; GetWindowRect(hWnd, &rcWindow); Sleep(50); pixel = GetPixel(hdc,rcWindow.left+120,rcWindow.top+38); /*Nimmt den Pixelwert an einer bestimmten Stelle des Spiels, durch die GetWindowRect funktion wird bei jeder Auflösung die richtige Position genommen*/ if (pixel != 2232746) { INPUT InputData; int iEvents; // key-down InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0; InputData.ki.wScan = 06; InputData.ki.dwFlags = KEYEVENTF_SCANCODE; InputData.ki.time = 0; InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData)); Sleep(100); // key-up InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0; InputData.ki.wScan = 06; InputData.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; InputData.ki.time = 0; InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData)); } } return 0; }
-
Damit ich mich ja gerade mit einem ähnlichem Problem konfrontiert sehe.
Soweit ich weiß - und hier gerade auch gelesen habe - unterbindet DirectInput die Annahme von WindowsMessages. Als Lösung wurde ein Hook vorgeschlagen.
-
Vielleicht funktioniert ja bloss das mit GetPixel nicht so wie du meinst.
Hast du schon probiert einfach immer, sagen wir in Abständen von 1-2 Sekunden, einen Tastendruck zu senden? Also so alawhile (1) { Sleep(1000); SendKeyDown(); Sleep(1000); SendKeyUp(); }
-
also daran liegts nich, wie gesagt, wenn ich in notepad bin oder so wo der benötigte pixelwert ja nich da is drückt er die 5.
-
Lies dir das mal durch. Da solltest Du sehen wo dein Problem liegt.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-48506-and-highlight-is-direct3d.html
-
Ja, also ich habs immernoch nich hingekriegt... Hooks sind doch eigentlich eher zum abfangen von Tasten oder?
Es muss doch irgend jemand ne Lösung wissen?!
-

-
hat niemand eine lösung, würde mich nämlich auch interessieren, hab genau daselbe problem...
wenn ich jedoch einen Mausklick simuliere (mit SendInput) klappt das ohne probleme...