keybd_event funktioniert nicht richtig [gelöst]
-
Hallo liebe Community,
Ich habe folgendes Problem:
Zurzeit arbeite ich an einem Programm, dass unter anderem auch an zwei Stellen Tastatureingaben simulieren soll. Ich habe bereits nach Einträgen im Forum gesucht bin jedoch jetzt auf die schnelle nicht fündig geworden bzw. es scheint, als wäre sonst hier noch keiner mit dem Problem in Kontakt gekommen.
Ich simuliere an einer Stelle ein ENTER (VK_RETURN), was auch hervorragend funktioniert. An einer anderen Stelle möchte ich jetzt aber CTRL+F4 simulieren (VK_LCONTROL+VK_F4) um einen Browser-Tab zu schließen. Hier ist mal ein Ausschnit vom Programm->int i; for(i=0;i<tabstoclose;i++) { SetKeyboardInput(Hbrowser); keybd_event(VK_LCONTROL,0,KEYEVENTF_EXTENDEDKEY,0); Sleep(10); keybd_event(VK_F4,0,KEYEVENTF_EXTENDEDKEY,0); Sleep(50); keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0); Sleep(25); keybd_event(VK_F4,0,KEYEVENTF_KEYUP,0); Sleep(200); }So und mein Problem sieht so aus, dass danach anscheinend das CTRL hängen bleibt, oder irgendetwas in der Art. Auf jeden fall wird das Verhalten des Browsers dann verändert. Ich habe mich natürlich gewundert dass die RETURN Simulation nicht mehr funkioniert hat nach dieser Funktion und habe dann das Programm geschlossen und selbst einfach mal auf ein paar Tasten rumgeklimpert. Und dann kam bei "l" oder so (Buchstabe ist egal) dann die Lesezeichen-Liste und so weiter. Also irgendwas läuft da nicht richtig. Ich habe schon die Sleep()'s verschoben/geändert und die keyup events verschoben, aber nichts hat geholfen. SendInput läuft nicht mit CodeBlocks (IDE meiner Wahl) und MingW weil anscheinend irgendwelche DEFINES net richtig sind (in VC++ läufts) und mit SendMessage, was ich oft in euren Posts hier gelesen hatte, habe ich es noch nicht ausprobiert. Ich möchte allerdings gerne mal verstehen was da jetzt falsch abläuft. Ich muss nämlich dann das Programm selbst schließen und CTRL+ALT+ENTF und den Taskmgr öffnen damit dieser Fehler weg geht.
System: Windows 7 64-bit Ultimate
IDE: CodeBlocks (wie oben erwähnt)
Sprache: C (nicht C++! ich hoffe das ist an dieser Stelle kein Problem)
Browser: Firefox (3.5.7)Über schnelle Hilfe würde ich mich sehr freuen. Falls weitere Informationen nötig sind einfach bescheid sagen.
Danke!MfG
fuzion
-
Was bringt SetKeyboardInput?
-
int SetKeyboardInput(HWND hWnd) { int i=0; while((IsWindowEnabled(hWnd)==0)&&(i<1000)) { EnableWindow(hWnd,TRUE); i++; } if(IsWindowEnabled(hWnd)==0) return 1; else return 0; }Also das habe ich dann einfach mal noch eingebaut und führe das vor dieser Simulation sowie vor der ENTER-Simulation aus. Ich kann es allerdings auch weglassen, weil ich das vorher auch geregelt hatte, dass der Firefox "angesprochen" wird.
EDIT: Ach und die returns hab ich da nur drinne, um ggf. überprüfen zu können ob das Fenster jetzt den Fokus hat oder net. Da es aber alles soweit funktioniert und es nicht mein Problem ist das erstmal nicht relevant!
MfG
fuzion
-
int SetKeyboardInput(HWND hWnd) { int i=0; while((IsWindowEnabled(hWnd)==0)||(i<1000)) { EnableWindow(hWnd,TRUE); i++; } if(IsWindowEnabled(hWnd)==0) return 1; else return 0; }LOL!!!
-
Tut mir leid ?!
Mal abgesehen davon, dass mir bis jetzt noch nicht wirklich weitergeholfen wurde... bringt mir diese Aussage rein gar nichts. Dieses "Code-Wirrwarr" ist aus reiner Verzweiflung entstanden. Habe auch nicht mehr wirklich drüber nachgedacht, da meine Gedanken im Moment eher bei meinem oben beschriebenen Problem kreisen.
Ich sagte ja bereits, oder auch nicht ^^, dass ich nachher einfach alles mögliche ausprobiert habe und diese Funktion gar nicht benötige und diesen Thread habe ich dafür auch gar nicht geöffnet. Andererseits könntest du mir ja auch mal dein "LOL" ein wenig genauer erläutern.Vielleicht ist hier ja doch noch der Ein oder Andere der mir ein sachliches Feedback zu meinem Problem geben kann. Falls noch irgendwelche Info benötigt wird fragt bitte einfach nach.
Danke
-
du solltest KEYEVENTF_EXTENDEDKEY schon auch beim "key-up" teil mitgeben:
keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0); Sleep(10); keybd_event(VK_F4, 0, KEYEVENTF_EXTENDEDKEY, 0); Sleep(50); keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); Sleep(25); keybd_event(VK_F4, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); Sleep(200);
-
Upps

Danke vielmals für die Hilfe! Es funktioniert jetzt alles
Darauf hatte ich gar nicht mehr geachtet, vor allem weil es ja mit dem Enter komischer Weise immer funktioniert hat. Aber trotzdem danke, danke, danke.