Benutzer mit den meisten Antworten
Makros in anderen Programm via Windows API und C#

Frage
-
Hallo
Ich möchte Folgendes realisieren, scheite aber leider kläglich bei der Umsetzung:
Ich möchte, dass wenn ich in einem anderen Programm eine bestimmte Buchstabenkombination (also einen string, zum Beispiel "etc") eingebe, dass das Programm dies erkennt.
Ich habe einen globalen Keyboard Hook über die Windows API, ich kann mir auch alle eingegebenen Buchstabens zu nem String hinzufügen lassen, allerdings gibt es dort Probleme mit Sonderzeichen und Groß- und Kleinschreibung. So wird aus einem "/" leider schnell eine 7 oder aus einem großen A ein Kleines.
Meine VKCodeToString Methode sieht so aus:
public static string VKCodeToString(uint VKCode, bool isKeyDown) { // ToUnicodeEx needs StringBuilder, it populates that during execution. System.Text.StringBuilder sbString = new System.Text.StringBuilder(5); byte[] bKeyState = new byte[255]; bool bKeyStateStatus; bool isDead = false; // Gets the current windows window handle, threadID, processID IntPtr currentHWnd = GetForegroundWindow(); uint currentProcessID; uint currentWindowThreadID = GetWindowThreadProcessId(currentHWnd, out currentProcessID); // This programs Thread ID uint thisProgramThreadId = GetCurrentThreadId(); // Attach to active thread so we can get that keyboard state if (AttachThreadInput(thisProgramThreadId, currentWindowThreadID, true)) { // Current state of the modifiers in keyboard bKeyStateStatus = GetKeyboardState(bKeyState); // Detach AttachThreadInput(thisProgramThreadId, currentWindowThreadID, false); } else { // Could not attach, perhaps it is this process? bKeyStateStatus = GetKeyboardState(bKeyState); } // On failure we return empty string. if (!bKeyStateStatus) return ""; // Gets the layout of keyboard IntPtr HKL = GetKeyboardLayout(currentWindowThreadID); // Maps the virtual keycode uint lScanCode = MapVirtualKeyEx(VKCode, 2, HKL); // Keyboard state goes inconsistent if this is not in place. In other words, we need to call above commands in UP events also. if (!isKeyDown) return ""; // Converts the VKCode to unicode int relevantKeyCountInBuffer = ToUnicodeEx(VKCode, lScanCode, bKeyState, sbString, sbString.Capacity, (uint)0, HKL); string ret = ""; switch (relevantKeyCountInBuffer) { // Dead keys (^,`...) case -1: isDead = true; // We must clear the buffer because ToUnicodeEx messed it up, see below. ClearKeyboardBuffer(VKCode, lScanCode, HKL); break; case 0: break; // Single character in buffer case 1: ret = sbString[0].ToString(); break; // Two or more (only two of them is relevant) case 2: default: ret = sbString.ToString().Substring(0, 2); break; } // We inject the last dead key back, since ToUnicodeEx removed it. // More about this peculiar behavior see e.g: // http://www.experts-exchange.com/Programming/System/Windows__Programming/Q_23453780.html // http://blogs.msdn.com/michkap/archive/2005/01/19/355870.aspx // http://blogs.msdn.com/michkap/archive/2007/10/27/5717859.aspx if (lastVKCode != 0 && lastIsDead) { System.Text.StringBuilder sbTemp = new System.Text.StringBuilder(5); ToUnicodeEx(lastVKCode, lastScanCode, lastKeyState, sbTemp, sbTemp.Capacity, (uint)0, HKL); lastVKCode = 0; return ret; } // Save these lastScanCode = lScanCode; lastVKCode = VKCode; lastIsDead = isDead; lastKeyState = (byte[])bKeyState.Clone(); return ret; }
Grüße
- Bearbeitet TZDEV Montag, 6. Juli 2015 17:59
Antworten
-
Hallo TZDEV,
das Problem dürfte sein, dass du zwar die Tasten einfängst, aber nicht ob diese mit STRG oder SHIFT verwenden würde.
Wenn ich z.B. die 7-Taste mit der Shirt-Taste drücken, habe ich ein /.
Versuche doch diese Tasten mitzufangen und speichere dir als Flag, wann sie gesdrückt wurtden und wann sie wieder losgelassen wurden.
© 2015 Thomas Roskop
Germany // Deutschland- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 20. Juli 2015 06:41
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 31. Juli 2015 15:04
-
Hi,
vor einigen Jahren hatte ich auch mal eine ähnliche Anforderung und benötigte einen guten Keyboard und Mouse Hook. Schaue mal hier unter Code Project Global Mouse und Keyboard Hook
Du benötigst bei weitem nicht alles aus dem Beispiel (ist sehr umfangreich). Setze nur mal in dem Demo Programm das Häkchen bei "KeyPress" und du wirst sehen das alle Sonderzeichen sehr gut abgefangen werden. Das kannst du sicher ohne Probleme bei dir implementieren.
Das Projekt ist etwas älter aber funktioniert auch wunderbar mit allen neueren Framework Versionen. Habe es eben nochmal getestet bis 4.5.1. Das ganze basiert auf den WinAPI.
Gruß
Jens Gerber
- Bearbeitet Jens Gerber Dienstag, 7. Juli 2015 23:33
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 20. Juli 2015 06:41
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 31. Juli 2015 15:04
-
Hallo zusammen,
statt dem manuellen verarbeiten kannst du auch auf die entsprechenden WinAPI-Funktionen zurück greifen. Mir kommen da ToAscii und ToUnicode in den Sinn. Die Methoden geben entsprechend das Zeichen anhand des angegebenen VK_CODEs und des Keyboard States zurück. Letzteres bekommst du über die GetKeyboardState-Methode.
Das hat den Vorteil das Windows selbst darauf achtet welches Tastaturlayout eingestellt ist.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 20. Juli 2015 06:41
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 31. Juli 2015 15:04
Alle Antworten
-
Hallo TZDEV,
ich habe noch ein bisschen rumprobiert, bin aber nicht wirklich weitergekommen. Ich hoffe, dass sich jemand mit größerer Erfahrung einschaltet.
Gruß
Aleksander
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo TZDEV,
das Problem dürfte sein, dass du zwar die Tasten einfängst, aber nicht ob diese mit STRG oder SHIFT verwenden würde.
Wenn ich z.B. die 7-Taste mit der Shirt-Taste drücken, habe ich ein /.
Versuche doch diese Tasten mitzufangen und speichere dir als Flag, wann sie gesdrückt wurtden und wann sie wieder losgelassen wurden.
© 2015 Thomas Roskop
Germany // Deutschland- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 20. Juli 2015 06:41
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 31. Juli 2015 15:04
-
Hallo zusammen,
statt dem manuellen verarbeiten kannst du auch auf die entsprechenden WinAPI-Funktionen zurück greifen. Mir kommen da ToAscii und ToUnicode in den Sinn. Die Methoden geben entsprechend das Zeichen anhand des angegebenen VK_CODEs und des Keyboard States zurück. Letzteres bekommst du über die GetKeyboardState-Methode.
Das hat den Vorteil das Windows selbst darauf achtet welches Tastaturlayout eingestellt ist.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 20. Juli 2015 06:41
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 31. Juli 2015 15:04
-
Hi,
vor einigen Jahren hatte ich auch mal eine ähnliche Anforderung und benötigte einen guten Keyboard und Mouse Hook. Schaue mal hier unter Code Project Global Mouse und Keyboard Hook
Du benötigst bei weitem nicht alles aus dem Beispiel (ist sehr umfangreich). Setze nur mal in dem Demo Programm das Häkchen bei "KeyPress" und du wirst sehen das alle Sonderzeichen sehr gut abgefangen werden. Das kannst du sicher ohne Probleme bei dir implementieren.
Das Projekt ist etwas älter aber funktioniert auch wunderbar mit allen neueren Framework Versionen. Habe es eben nochmal getestet bis 4.5.1. Das ganze basiert auf den WinAPI.
Gruß
Jens Gerber
- Bearbeitet Jens Gerber Dienstag, 7. Juli 2015 23:33
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 20. Juli 2015 06:41
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 31. Juli 2015 15:04
-
Hallo TZDEV,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben. Solltest Du noch Rückfragen dazu haben, gib bitte Bescheid.
Gruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.