Probleme mit der Simulation von Tastatureingaben
-
Hallo,
das ist mein erster Beitrag hier und ich hoffe, dass ich die richtige Kategorie getroffen habe...Ich habe bei folgendem kleinen Programm Probleme:
Die Idee:
Bei Windows gibt es ja die praktische Tastenkombination "Steuerung + Umschalttaste (Shift) + linke/rechte Pfeiltaste", die ein ganzes Wort bis zum nächsten Leerzeichen markiert. Die wollte ich mir zunutze machen und ein kleines Programm schreiben, dass in jedem beliebigen offenen Fenster automatisch einzelne Wörter markiert und kopiert, in dem das Kopieren möglich ist.Der Code:
//(...) //Klicken mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //Warten Sleep(250); //Steuerungs- und Hochschalttaste, dann linke Pfeiltaste drücken keybd_event(VK_SHIFT, 0, 0, NULL); keybd_event(17, 0, 0, 0); keybd_event(39, 0, 0, 0); //Warten Sleep(1000); //Steuerungs- und Hochschalttaste loslassen keybd_event(VK_SHIFT, 0, 0x02, NULL); keybd_event(17, 0, 0x02, 0); keybd_event(39, 0, 0x02, 0); (...)Das soll das Programm machen:
Zuerst setzt das Programm durch Simulation eines Mausklicks den Cursor an den Wortanfang, dann simuliert es die Tastencombination "Steuerung + Shift + rechte Pfeiltaste", um das nächste Wort bis zum nächsten Leerzeichen zu markieren. Das ganze wird dann kopiert usw.Das macht das Programm:
Es funktioniert alles prächtig bis auf das Simulieren der Shift-Taste. Der Cursor wird gesetzt, dann wird allerings nur die Tastenkombination "Steuerung + rechte Pfeiltaste" ausgeführt, was einen Sprung zum nächsten Wort bewirkt, allerdings ohne jegliche Markierung. Daraus schließe ich, dass die Shift-Taste nicht gedrückt wurde...Warum klappt die Simulation des Drückens der Shift-Taste nicht, der Rest geht doch auch ?
Ist das Ganze überhaupt ein sinnvoller Ansatz (mit keybd_event) oder sollte ich lieber anders an die Sache rangehen ?Das wäre meine Hauptfragen, ich bin aber offen für alles, was das Programm zum Laufen bringt...
Ich bin noch ziemlicher Anfänger in C/C++ und will gar nicht auf eine reine und hocheffektive Programmierung hinaus, es soll nur gehen...Nebenbei, das Sleep ist auch noch ein kleines Problem:
Wenn ich das Programm beenden will, während Sleep läuft, reagiert es natürlich nicht...
Gibt es da eine bessere Funktion, die das Programm pausiert ?Als Compiler benutze ich Borland C++ Builder 6...
Ich hoffe, ihr könnt mir helfen
MfG
payerror
-
Du mußt die Tasten in der umgekehrten Reihenfolge wieder loslassen (so wie du es selber ja auch machen würdest).
Und 1 Sekunde zu warten brauchst du auch nicht dazwischen.(wenn dann reichen einige Millsekunden).
Und beim BCB gibt es die Methode Application->ProcessMessages(), in der die Windows-Botschaften abgearbeitet werden (bzgl. Beenden des Programms).
Statt Sleep kannst du dann folgende Methode verwenden:void Wait(unsigned long nWait) { unsigned long nSleep = 10; // <- dieser Wert kann auch verändert werden unsigned long nCount = nWait/nSleep; for(unsigned int i=0; i<nCount; i++) { Sleep(nSleep); Application->ProcessMessages(); } }P.S. Statt der Magic Numbers würde ich auch besser VK_CONTROL und VK_LEFT verwenden...
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Vielen Dank erstmal für die Antwort und auch, dass der Thread verschoben wurde...
Dein Vorschlag funktioniert leider auch nicht, Th, aber ich habe eine andere Möglichkeit gefunden, die Wörter zu markieren: Mithilfe der Simulation der Mauseingabe...Das klappt...Nur habe ich jetzt ein neues Problem: Ich will mit dem Befehl keybd_event einen ".", ein "/" und einen ":" simulieren...
Das geht irgendwie nicht, ich hab das einfach genauso gemacht wie bei Buchstaben, hier mal ein kleines Beispiel://Buchstabe: "h" keybd_event(72,0,0,0); keybd_event(72,0,0x02,0); Sleep(100); //Buchstabe: "t" keybd_event(84,0,0,0); keybd_event(84,0,0x02,0); Sleep(100); //Buchstabe: "t" keybd_event(84,0,0,0); keybd_event(84,0,0x02,0); Sleep(100); //Buchstabe: "p" keybd_event(80,0,0,0); keybd_event(80,0,0x02,0); Sleep(100); //Buchstabe: ":" keybd_event(58,0,0,0); keybd_event(58,0,0x02,0); Sleep(100); //Buchstabe: "/" keybd_event(47,0,0,0); keybd_event(47,0,0x02,0); Sleep(1000); //Buchstabe: "/" keybd_event(47,0,0,0); keybd_event(47,0,0x02,0); Sleep(100);Das Problem sind die Sonderzeichen, die Buchstaben gehen...
EDIT: Der Slash geht jetzt, nur der Punkt und der Doppelpunkt, die gehen nicht...Vielen Dank im Voraus
payerror
-
Die Funktion keybd_event() erwartet ja auch eine virtuelle Taste (VK), keinen ASCII-Code. Schau mal in der MSDN http://msdn2.microsoft.com/en-us/library/ms645540.aspx
Was du suchst, ist wahrscheinlich VK_OEM_COMMA und VK_OEM_...
Vllt. solltest du dich erst mal mit einfacheren Programmieraufgaben beschäftigen, insbesondere nicht gleich mit komplizierten Win-API Funktionen?
-
Vielen Dank, das hat mir sehr geholfen, ich war auch schon auf der Suche nach Virtuellen Tastencodes, hab aber immer bloß ein paar gefunden oder unvollständige Listen...
Danke, hier kann geschlossen werden
MfG
payerror