Windows.h - Mausklicks werden nicht erkannt!
-
Hi,
Ich arbeite an einem "Aufnahme" Programm, dass die Mausposition, Mausklicks und Tastatureingaben speichert.
Nachdem aufgenommen wurde, werden die Aufnahmen genutzt um die Eingaben nochmal zu wiederholen (letztlich soll es ein sehr flexibles Automatisierungstool werden).Beim Ausführen funktioniert das Setzen der Mausposotion einwandfrei, aber leider funktioniert die
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Methode nicht immer (manchmal funktioniert sie).
Gibt es da irgendwelche Dinge, die man über Windows.h wissen muss? Liegt es vielleicht an irgendwelchen Berechtigungen und das OS blockt manche Eingaben(nutze win7)?
Wäre über Tipps sehr dankbar!
Gruß,
moccajoghurt
edit:
Das Problem liegt bei dem Aufzeichnen der Klicks nicht beim Ausführen. Siehe vierter post.
-
EDIT: Deutsche Übersetzung
Ich bin nicht so versiert in Windows-Message Handling.
Meine erste Idee wäre, dass Dir das Event von anderen Prozessen oder sogar Systemprozessen weggeschnappt wird.
Daher würde ich überlegen, einen Hook anzusetzen wie MouseProc()
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx
-
Hatte ausversehen auf englisch gefragt (bin durcheinander gekommen). Hab es jetzt nochmal auf deutsch formuliert.
-
Ich habe mich getäuscht und festgestellt, dass der Fehler nicht beim Ausführen des Records liegt, sondern beim Aufzeichnen der Klicks!
Es wird nämlich immer nur dann ein Klick "erkannt" wenn das Objekt auf das man klickt, den Fokus besitzt. Das bedeutet, dass alle Klicks, die auf ein Objekt klicken, welches momentan nicht den Fokus besitzt, nicht erkannt werden.
Vielleicht ist dadurch gar kein Hook nötig. Weiß jemand wie man das neue Problem lösen könnte?
-
Ich würde tippen dass man genau deswegen den Hook braucht. Du willst die Mausbewegungen ja auch für anwendungsexterne Programme aufzeichnen, oder?
-
Vielleicht suchst du ja mouse capture.
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo, mouse_event ist eine legacy(veraltete) Funktion,benutz lieber SendInput.
Note This function has been superseded. Use SendInput instead.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646260(v=vs.85).aspxUnd verwende mal eine Hardware Scan Code bei mouse_event bzw. SendInput.
Wie kriegt man die Hardware Scan Codes raus?
Das geht damit: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646306(v=vs.85).aspx
Und im Benuzg auf mal funktioniert es und mal funktioniert es nicht:
Schau mal hier: http://www.c-plusplus.net/forum/289087Hooks könnten vielleicht auch interessant für dich sein.
Globaler Mouse Hook
#include <iostream> #include <windows> using namespace std; static HHOOK hhookSysMsg; bool un; HOOKPROC lpfn; long mouse_pos_X; long mouse_pos_Y; WPARAM wParam; MOUSEHOOKSTRUCT m_struct; LRESULT CALLBACK HookMouseInApplication(int nCode, WPARAM wParam, LPARAM lParam); int main(int argc, char* argv[]) { HHOOK g_Hook; HANDLE g_evExit; MSG msg; DWORD status; g_evExit = CreateEvent(0, TRUE, FALSE, 0); if (!g_evExit) { cerr << "CreateEvent error: " << GetLastError() << endl; system("PAUSE"); return 0; } hhookSysMsg = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)HookMouseInApplication, GetModuleHandle(0), 0 ); if ( hhookSysMsg == 0 ) { cerr<<"set hook error: "<<GetLastError()<<endl; system("PAUSE"); return 0; } while(1) { // geht auch mit: GetMessage(&msg, 0, 0, 0); PeekMessage(&msg, 0, 0, 0, PM_REMOVE); DispatchMessage(&msg); } system("PAUSE"); return 0; } //--------------------------------------------------------------------------- LRESULT CALLBACK HookMouseInApplication(int nCode, WPARAM wParam, LPARAM lParam) { MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*) lParam; mouse_pos_X = mhs->pt.x; mouse_pos_Y = mhs->pt.y; cout<<"X: " << mouse_pos_X<<" "<<"Y: " << mouse_pos_Y << endl; //datei << mouse_pos_X << "\n"; // datei << mouse_pos_Y << "\n"; return CallNextHookEx(hhookSysMsg , nCode, wParam, lParam); }
Globaler Tastatur Hook
#include <iostream> #include <windows> #include <fstream> using namespace std; static HHOOK hhookSysMsg; bool un; HOOKPROC lpfn; long mouse_pos_X; long mouse_pos_Y; WPARAM wParam; MOUSEHOOKSTRUCT m_struct; LRESULT CALLBACK GlobalKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam); int main(int argc, char* argv[]) { HHOOK g_Hook; HANDLE g_evExit; MSG msg; DWORD status; g_evExit = CreateEvent(0, TRUE, FALSE, 0); if (!g_evExit) { cerr << "CreateEvent error: " << GetLastError() << endl; system("PAUSE"); return 0; } hhookSysMsg = SetWindowsHookEx(WH_KEYBOARD_LL , (HOOKPROC)GlobalKeyboardHook, GetModuleHandle(0), 0 ); if ( hhookSysMsg == 0 ) { cerr<<"set hook error: "<<GetLastError()<<endl; system("PAUSE"); return 0; } while(1) { // geht auch mit: GetMessage(&msg, 0, 0, 0); PeekMessage(&msg, 0, 0, 0, PM_REMOVE); DispatchMessage(&msg); } system("PAUSE"); return 0; } //--------------------------------------------------------------------------- LRESULT CALLBACK GlobalKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam ) { if(nCode == HC_ACTION) { cout<<(( KBDLLHOOKSTRUCT * ) lParam )-> vkCode<<endl; // Typekonvertierung von LPARAM auf KBDLLSTRUCT } return CallNextHookEx(hhookSysMsg , nCode, wParam, lParam); }
-
Dein hook ist schrott...bitte mach dich vorher schlau, und dann posten.
Füd globale keyhooks benötigt man ausserdem das ganzs in einer dll, abgesehen von einem shared segment!
-
Komisch, bei funktioniert es ohne DLL. :p
-
Wirst schon probleme bekommen...wart es ab
beschtimmte scenarien.
-
Ich lass mich gerne eines besseren belehren.
Bei welche Szenarien z.b. könnte ich denn da Probleme bekommen?
-
the holder schrieb:
Dein hook ist schrott...
Ganz Deiner Meinung!
the holder schrieb:
bitte mach dich vorher schlau, und dann posten.
Füd globale keyhooks benötigt man ausserdem das ganzs in einer dll, abgesehen von einem shared segment!Das gilt nicht für _LL Hooks!
MSDN schrieb:
The keyboard input can come from the local keyboard driver or from calls to the keybd_event function. If the input comes from a call to keybd_event, the input was "injected". However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.
-
Was ist den daran nun so schlecht?
Bzw. wie macht man es richtig?