Guten Abend alle zusammen,
ich habe ein kleines Problem was mich nun schon seit etlichen Stunden beansprucht und mir keine Ruhe lässt. Leider bin ich noch zu keiner Lösung gekommen.
Grundsätzlich nutze ich folgenden KeyboardHook (Danke hier nochmal an Ayke für den tollen Hook!):
KeyboardHook, MouseHook, WindowHook [HookInput]
Mein Ziel ist es, beim drücken der Taste F8 einen Sendkey mit der Kombination STRG + C auszulösen. Anschließend soll ein markierter Text (das hat der Nutzer schon getan bevor er die Taste gedrückt hat) aus der Zwischenablage kopiert werden. Das funktioniert auch grundsätzlich:
private void key_press(object sender, KeyEventArgs e)
{
try
{
SendKeys.SendWait("^(C)");
zwischenablage = Clipboard.GetText(); n
}
catch { /*this.Close();*/ }
e.Handled = true;
}
Problem dabei ist, es funktioniert im Notepad und überall da, wo ich ein Text-Eingabe-Feld habe. In dem Moment, wo ich allerdings in einem Browser oder einem anderen Programm einen Teil eines Textes markiere und dann F8 drücke, funktioniert es nicht. Hat jemand eine Erklärung / Idee wieso sich das so unterschiedlich verhält?
SendKeys ist denke ich hier das Problem oder?
Das schaut schon wieder nach irgendeinem Hack aus... Kannst du nicht einfach eine Extension für Firefox schreiben?
Hallo!
@Coder007:
Ich denke mal, es soll eine allgemeine Lösung erstellt werden, wobei nicht für jede bockende Anwendung eine Erweiterung geschrieben werden soll.
STRG-C funktioniert ja normalerweise auch in FireFox.
Hier kann es evtl. daran liegen, dass FireFox entweder F8 selbst abfängt (mal einen anderen HotKey verwenden) oder es liegt daran, dass Firefox (wie viele andere Browser) größtenteils auf selbstentwickelte Controls setzen (also keine Windows-Standard-Controls), die evtl. nicht korrekt auf Sendkeys reagieren.
Nobody is perfect. I'm sad, i'm not nobody 🙁
Das mag schon sein, trotzdem ist es für mich keine "Lösung". Ich würde es nie in Betracht ziehen, so eine Software einzusetzen. Entweder es ist sinnvoll aufgebaut, oder ich lass es bleiben. Und alles, was irgendwelche Hooks einsetzt und Tastendrücke simuliert, ist eindeutig nicht sauber.
Da könnte man noch eher ein Autoit Script schreiben, bevor man sowas selber programmiert.
Hallo!
@Coder007:
Wie würdest du denn vorgehen, um den in einer beliebigen Anwendung markierten Text in die Zwischenablage oder direkt ein eigenes Programm zu kopieren?
Mir fällt nur die Möglichkeit über SendKeys oder WindowMessages ein.
Und bzgl. der Hooks werden diese ja nur zum Abfangen der Tastendrücke verwendet, nicht zum simulieren der Tastendrücke.
Von daher kann ich hier kein "unsauberes" oder nicht sinnvolles Vorgehen erkennen.
Ein AutoIt-Skript hilft ab dem Zeitpunkt nicht mehr, wenn der Text anschließend noch weiter verarbeitet werden soll (z.B. wählen einer markierten Telefonnummer).
Nobody is perfect. I'm sad, i'm not nobody 🙁
Wie würdest du denn vorgehen, um den in einer beliebigen Anwendung markierten Text in die Zwischenablage oder direkt ein eigenes Programm zu kopieren?
Gar nicht! Wenn ich das wirklich haben will, dann würd ich Änderungen der Zwischenablage überwachen und dann darauf reagieren. Der Benutzer muss dann selber kopieren, kommt auf dasselbe hinaus. Muss man natürlich die genauen Anforderungen kennen. Aber ein Programm, das Tastendrücke an ein anderes Programm sendet, ist mir zu sehr zusammengebastelt, um sowas mach ich immer einen Bogen.
Bitte bleibt beim Thema. Das ist nicht der Sinn oder die "Sauberkeit" der Verwendung von SendKeys oder Hooks.
Hallo zusammen,
danke erstmal für die Antworten. Das mit den eigenen Controls usw. habe ich auch schon festgestellt / gelesen / vermutet. Allerdings bin ich mir sicher, dass es einen Lösungsweg geben muss. Der Grund warum ich eine solche Software schreiben möchte, ist der das eine alte Software die genau diese Funktion bereit stellt, dies nun nicht mehr tut, da Sie in ein Webinterface umgezogen ist.
Ich habe leider keinerlei Kenntnisse um hier ein Reverse Engineering oder ähnliches durchzuführen. F8 ist in Firefox nicht belegt. Ich habe allerdings festgestellt, dass die andere Software überall funktioniert. Egal in welchem Programm. Drücke ich zum Beispiel in Firefox F11 (während die alte Version des anderen Programmes läuft) passiert genau das, was passieren soll. Nichts weiter. Obwohl Firefox normalerweise mit F11 in den Vollbildmodus wechselt.
Bei meinem Hook verhält es sich eher so, dass Firefox dann direkt in den Vollbildmodus wechselt. Vielleicht hilft das ja irgendwem hier für einen Ideen-Ansatz ich bin nämlich langsam leer davon...
Danke!
Wenn die alte Software funktioniert, kannst du ja einen API Monitor ausprobieren, z.B. den:
http://www.rohitab.com/apimonitor
Damit solltest du dann sowas wie SendMessage oder PostMessage sehen und schauen, was genau gesendet wird...
Warum? Funktioniert bei mir wunderbar auch mit .NET
Wenn das eh .NET ist, kannst du natürlich auch mit Reflector reinschauen, das sollte auch nicht so schwer sein, selbst wenn das Programm obfuskiert wurde.
Die Portable, 32 Bit. In der Prozessliste seh ich auch meine .NET Anwendungen und kann sie hooken.
Der einzige Build der bei mir nicht meckert, ist die Version 2 Portable aber wirkliche Ergebnis sehe ich dabei nicht 😉
Naja, ich suche dann mal weiter...
Naja, du suchst halt im Filter nach Sendmessage und Postmessage und schaust, ob du welche findest. Wenn du nichts findest, suchst du nach anderen APIs, die dafür in Betracht kommen, z.B. keybd_event