Senden Keystrokes zu einem Programm, auch wenn seine im Hintergrund c #
-
11-10-2019 - |
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.
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.