Taste an Spiel senden
-
also auch mit nem hook gemacht letztlich. das muss doch auch irgendwie einfacher gehn.... ich will nich einfach nur was kopiern, will das was ich benutz auch verstehen und hooks sind schon was für sich find ich.
-
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...