SwordMaster Geschrieben 19. Januar 2006 Geschrieben 19. Januar 2006 Hallo Leute. Ich hab mittels SetWindowsHookEx einen Keyboard Hook.... Das ganze funktioniert auch schon perfekt... Jetzt möchte ich bei einer Bestimmten Tastenkombination (z.B. Strg + 1) die Markierten Daten in den Zwischenspeicher kopieren (also das gleiche wie bei Strg+C) und dann gleich danach noch einen bestimmten quellcode ausführen. also hätte ich folgendes bei der Tastenkombination Strg + 1 versucht keybd_event(17, 0, 0, 0); // Strg down keybd_event(67, 0, 0, 0); // c down keybd_event(17, 0, 0x02, 0); // Strg up keybd_event(67, 0, 0x02, 0); // c up <-- und hier dann noch zusätzlichen Quellcode. Das Problem ist dass die keybd_events irgendwie erst später abgehandelt werden! (also nach meinem zusätzlichen Quellcode) Ich denke, dass es daran liegt, weil ich ja zu dem zeitpunkt noch mitten in der Behandlung von "Strg" + "1" bin. Also liegt das simulierte Strg+c in einer art warteschleifen... Habt ihr eine Lösung für mich? Zitieren
Guybrush Threepwood Geschrieben 19. Januar 2006 Geschrieben 19. Januar 2006 Wieso kopierst du die Daten nicht selbst in die Zwischenablage anstatt nen Tastendruck zu simulieren? Zitieren
SwordMaster Geschrieben 19. Januar 2006 Autor Geschrieben 19. Januar 2006 weil ich nicht weiß was gerade markiert ist. Die Tastenkombination gilt systemweit. Man kann sich also theoretich im MSPaint, Word, Editor oder in irgendwelchen anderen X-Beliebigen Programmen befinden. und wenn ich die Daten selbst in die Zwischenablage kopieren würde, müsste ich ja immer erst herrausfinden welche Anwendung gerade läuft, und welche daten Markiert sind.... usw. :-( Zitieren
Klotzkopp Geschrieben 20. Januar 2006 Geschrieben 20. Januar 2006 Zuerst ganz allgemein: Ich wäre ziemlich sauer, wenn irgendein Hook mir den Inhalt der Zwischenablage ersetzt, wenn ich Strg-1 drücke. Je nach Programm mache ich das häufiger. also hätte ich folgendes bei der Tastenkombination Strg + 1 versuchtWie erkennst du denn diese Tastenkombination? Hast du getestet, ob das funktioniert? keybd_event(17, 0, 0, 0); // Strg down keybd_event(67, 0, 0, 0); // c down keybd_event(17, 0, 0x02, 0); // Strg up keybd_event(67, 0, 0x02, 0); // c up Also ich lasse immer zuerst C los, dann Strg. Aber Strg sollte doch gerade sowieso gedrückt sein. Oder legst du erst nach dem Up-Event der Strg-Taste los? Das Problem ist dass die keybd_events irgendwie erst später abgehandelt werden! (also nach meinem zusätzlichen Quellcode)Natürlich. Dein Hook läuft erst mal weiter. Das Programm hatte noch gar keine Gelegenheit, auf die Events zu reagieren, die du ausgelöst hast. Die Tastenkombination gilt systemweit. Eben nicht. Strg-C und Co. sind keine "systemweiten" Tastenkombinationen, sondern einfach nur in praktisch jedem Programm drin. Wenn es da windowsseitig einen Automatismus gäbe, könntest du den ja anstatt dieser Events nutzen. Landen die Events eigentlich auch wieder in deinem Hook? Zitieren
Guybrush Threepwood Geschrieben 20. Januar 2006 Geschrieben 20. Januar 2006 Eben nicht. Strg-C und Co. sind keine "systemweiten" Tastenkombinationen, sondern einfach nur in praktisch jedem Programm drin. Wenn es da windowsseitig einen Automatismus gäbe, könntest du den ja anstatt dieser Events nutzen. Naja es gibt schon einen Automatismus von Windows. Wenn ich einfach ein Fenster mit einem Editfeld erstelle kann ich da per Strg+C was rauskopieren bzw. mit Strg+V was einfügen ohne das ich das selber programmieren muss. Das ist also schon im Steuerelement verankert. Bei komplexeren Sachen hast du natürlich recht. Zitieren
SwordMaster Geschrieben 20. Januar 2006 Autor Geschrieben 20. Januar 2006 Zuerst ganz allgemein: Ich wäre ziemlich sauer, wenn irgendein Hook mir den Inhalt der Zwischenablage ersetzt, wenn ich Strg-1 drücke. Je nach Programm mache ich das häufiger. Da hast du natürlich recht. aber das Programm werde nur ich verwenden. und ich MÖCHTE auch dass der markierte teil in der zwischenablage landen, nur dass noch zusätzlicher quellcode ausgeführt wird. Wie erkennst du denn diese Tastenkombination? Hast du getestet, ob das funktioniert? Ja die Tastenkombination erkenne ich bereits richtig. und der hook funktioniert. Habs einmal ganz einfach getestet in dem ich einfach "MessageBox" in meinem hook geschrieben habe. und dann erschien die messagebox immer bei strg+1. also der hook, läuft einwandfrei. Also ich lasse immer zuerst C los, dann Strg. Aber Strg sollte doch gerade sowieso gedrückt sein. Oder legst du erst nach dem Up-Event der Strg-Taste los? nein ich lege beim Down-Event los. => hast recht, Strg müßte noch gedrückt sein. Natürlich. Dein Hook läuft erst mal weiter. Das Programm hatte noch gar keine Gelegenheit, auf die Events zu reagieren, die du ausgelöst hast. Ja sowas in der Art hab ich mir gedacht. Das Strg+C liegt also in der Warteschleife bis ich mein Strg+1 abgearbeitet habe.... Die frage ist, kann ich wärend ich im Strg+1-hook bin, diese Warteschleife abarbeiten lassen? ich habe mal sowas ähnliches in einem anderen programm gehabt. da konnte ich mit while(PeekMessage(&msg, NULL, 0,0,PM_NOREMOVE)) AfxGetApp()->PumpMessage(); die Warteschleife meines eigenen programms abarbeiten. Aber gibt es sowas auch für mein jetziges problem? Landen die Events eigentlich auch wieder in deinem Hook? die events landen zwar im hook, aber der hook reagiert nur bei Strg+1 und hat keinen quellcode oder so für Strg+C. Das lasse ich ganz normal vorbei... Zitieren
Klotzkopp Geschrieben 20. Januar 2006 Geschrieben 20. Januar 2006 Ja sowas in der Art hab ich mir gedacht. Das Strg+C liegt also in der Warteschleife bis ich mein Strg+1 abgearbeitet habe.... Die frage ist, kann ich wärend ich im Strg+1-hook bin, diese Warteschleife abarbeiten lassen?Das halte ich für den falschen Ansatz. Ich glaube auch nicht, dass das überhaupt geht. Wie wäre es denn, wenn du einfach bei Strg-1 ein Flag setzt, und wenn dann kurze Zeit später dein Strg-C in deinem Hook aufschlägt, prüfst du das Flag und legst gegebenenfalls los? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.