Frage

Ich will auch Tastenhub an ein Programm senden, wenn es im Hintergrund läuft. Aber ich kann dies, wie dies für NOTIZBLOCK nur tun,

[DllImport("user32.dll")]
protected static extern byte VkKeyScan(char ch);

[DllImport("user32.dll", SetLastError = true)]
protected static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("User32.Dll", EntryPoint = "PostMessageA")]
protected static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

char Key = // key value to send

IntPtr hWnd = FindWindowEx(_handle, IntPtr.Zero, "edit", null);   // _handle is the windows handle of the program (here its notepad)
PostMessage(hWnd, WM_KEYDOWN, VkKeyScan(Key), 0);

Aber für alle anderen Anwendungen kann ich nicht Tastatureingaben, wenn seine im Hintergrund senden. Da ich die lpszClass dieses Programms nicht kennen (ich denke, das ist in diesem Programm der Usercontrol Name des Tipp Bereichs. Für NotePad es "edit" ist. Ich dieses Surfen Internet zu finden).

Für alle anderen Anwendungen, was ich tue ist, erhalten die Anwendung in den Vordergrund, dann den Schlüssel senden, dann wieder mein Programm Vordergrund bekommen. Ich brauche mein Programm als Vordergrund zu laufen immer.

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

SetForegroundWindow(_handle);       // _handle is the windows handle of the program

System.Threading.Thread.Sleep(50);       // Waiting few milliseconds till application coming to foreground.                    
wsh.SendKeys(Key.ToString(), ref wait);  // wsh is WshShellClass wsh= new WshShellClass();
SetForegroundWindow(_mainHandle);    // _mainHandle is the windows handle of my application

Aber auf diese Weise funktioniert nicht. einige Tasten verpasst bekommen und das Programm foreground-> Hintergrund-> foregound-> Hintergrund ...... wie sein Tanz ...

Wie Tasten auf andere Anwendungen senden, wenn seine im Hintergrund ausgeführt wird. oder gibt es eine Möglichkeit / Quelle der lpszClass eines Programms zu finden?

Sorry, wenn ich verpasst haben, die nötigen Angaben. Dies ist eine große Anwendung. Ich habe nur erforderlich, Teile hier gepostet. Wenn jemand keine zusätzliche Informationen benötigt, pls fragen.

War es hilfreich?

Lösung

Unter Umständen können Sie die lpszClass des Programms, um herauszufinden, ein Inspektionswerkzeug wie WinSpy ++ . Es gibt Ihnen ein Fadenkreuz, dass Sie über die gewünschte Steuerung ziehen und die Position kann. Dies konnte leicht um mich mit den „Bearbeiten“ Klassennamen für Notizblock.

Wenn die Dinge nicht funktionieren, klicken Sie auf den „Mehr >>“ Knopf in der unteren rechten Ecke der WinSpy ++, dann klicken Sie auf „Suchen“, um die Steuerungshierarchie zu betrachten; Sie müssen möglicherweise die WM_KEYDOWN Nachricht an einen der Eltern oder Kind Kontrollen statt schreiben.

Andere Tipps

ich glaube, Sie werden das Hintergrundprogramm installieren Sie eine Low-Level-Tastatur-Hook über die win32 Funktion SetWindowsHookEx haben müssen ().

Hier ist die MSDN-Dokumentation für SetWindowsHookEx ()

http://msdn.microsoft.com /en-us/library/ms644990(v=vs.85).aspx

Und hier ist der KB-Artikel auf, wie es von C # tun

http://support.microsoft.com/kb/318804

In diesem Artikel geht in einigen Details auch: http: //www.codeguru .com / Spalten / vb / article.php / c4829

Ich erwarte, dass Ihre Anwendung von verschiedenen Spyware / Anti-Viren-Software als Tastatur-Logger gefangen wird erhalten, though.

Viel Glück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top