2011-01-13 13 views
5

Ich möchte Key Stroke an ein Programm senden, auch wenn es im Hintergrund läuft. Aber ich kann dies für NOTIZBLOCK wie dies nur tun,Schicke Tastatureingaben an ein Programm, auch wenn es im Hintergrund mit C#

[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 Tastenanschläge senden, wenn seine im Hintergrund. Da ich die lpszClass dieses Programms nicht kenne (ich denke, das ist der UserControl-Name des Schreibbereichs in diesem Programm. Für NotePad ist es "edit". Ich fand dieses Surfen Internet).

Für alle anderen Anwendungen, was ich tue ist, holen Sie die Anwendung in den Vordergrund, dann senden Sie den Schlüssel, dann wieder mein Programm Vordergrund. Ich brauche mein Programm immer als Vordergrund ausgeführt werden.

[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 nicht funktioniert. einige Tasten werden verpasst und das Programm Vordergrund-> Hintergrund-> Vordergrund-> Hintergrund ...... wie sein Tanzen ...

Wie man Schlüssel zu anderen Anwendungen sendet, wenn es im Hintergrund läuft. oder gibt es eine Möglichkeit/Quelle, um die lpszClass eines Programms zu finden?

Entschuldigung, wenn ich irgendwelche erforderlichen Informationen verpasst habe. Dies ist eine große Anwendung. Ich habe hier nur erforderliche Teile gepostet. Wenn jemand zusätzliche Informationen benötigt, fragen Sie bitte.

+1

Hunderte von Fragen dazu bei SO bereits, nicht sicher, wie Sie sie verpasst haben. Was auch immer du tust, um den Fokus zurück zu bekommen, tu es nicht. –

Antwort

2

Sie können möglicherweise die lpszClass des Programms mit einem Prüfwerkzeug wie WinSpy++ herausfinden. Sie erhalten ein Fadenkreuz, das Sie über das gewünschte Steuerelement ziehen und positionieren können. Dies war in der Lage, mir einfach den Klassennamen "edit" für Notepad zur Verfügung zu stellen.

Wenn die Dinge nicht funktionieren, klicken Sie auf die Schaltfläche "Mehr >>" in der unteren rechten Ecke von WinSpy ++, dann klicken Sie auf die Schaltfläche "Lokalisieren", um die Steuerungshierarchie anzuzeigen; Möglicherweise müssen Sie stattdessen die WM_KEYDOWN-Nachricht an eines der übergeordneten oder untergeordneten Steuerelemente senden.

3

Ich denke, Sie müssen das Hintergrundprogramm installieren eine Low-Level-Tastatur-Hook über die Win32-Funktion SetWindowsHookEx().

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 geht von C#

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

Dieser Artikel geht in einigen Details auch : http://www.codeguru.com/columns/vb/article.php/c4829

Ich erwarte, dass Ihre App caug bekommen wird Allerdings von verschiedenen Spyware/Anti-Virus-Software als Tastatur-Logger.

Viel Glück.

+0

Dies würde die Fähigkeit erfordern, das andere Programm zu modifizieren, richtig?In diesem Fall wäre er besser in der Lage, zuerst eine saubere API bereitzustellen, um alles zu tun, was er braucht, anstatt Hacks wie das Senden von wichtigen Pressemeldungen oder Low-Level-Hooks. – Justin