Envoyer Frappes à un programme même si, en arrière-plan en utilisant c #
-
11-10-2019 - |
Question
Je veux envoyer la course clé d'un programme même si elle est en cours d'exécution en arrière-plan. Mais je peux le faire que pour NOTEPAD comme ça,
[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);
Mais pour toutes les autres applications que je ne peux pas envoyer des frappes si son en arrière-plan. Comme je ne sais pas le lpszClass
de ce programme (je pense que c'est le nom UserControl de la zone de frappe dans ce programme. Pour NotePad il est "edit"
. J'ai trouvé internet de surf).
Pour toutes les autres applications ce que je fais est, obtenir l'application au premier plan, puis envoyer la clé, puis obtenir à nouveau mon premier plan du programme. Je dois mon programme pour être exécuté en tant que premier plan toujours.
[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
Mais cette façon ne fonctionne pas. certaines touches se manquer et le programme foreground-> Background-> foregound-> ...... fond comme la danse ...
Comment envoyer les clés à d'autres applications si son fonctionnement en arrière-plan.
ou sont-il un moyen / source pour trouver le lpszClass
d'un programme?
Désolé si j'ai manqué l'information tout nécessaire. c'est une grande application. J'ai posté que les pièces nécessaires ici. Si quelqu'un a besoin d'informations supplémentaires, pls demander.
La solution
Vous pouvez être en mesure de comprendre le lpszClass
du programme à l'aide d'un outil d'inspection, comme WinSpy ++ . Il vous donne une forme de croix que vous pouvez faire glisser et la position sur le contrôle souhaité. Cela a été en mesure de me fournir facilement avec le nom de classe « modifier » pour le bloc-notes.
Si les choses ne fonctionnent pas, cliquez sur le « Plus >> » bouton en bas à droite de WinSpy ++, puis cliquez sur le bouton « Rechercher » pour afficher la hiérarchie de contrôle; vous devrez peut-être poster le message WM_KEYDOWN à l'un des contrôles parent ou enfant à la place.
Autres conseils
Je pense que vous aurez besoin d'avoir le programme d'arrière-plan installer un crochet du clavier bas niveau via la fonction win32 SetWindowsHookEx ().
Voici la documentation MSDN pour SetWindowsHookEx ()
http://msdn.microsoft.com /en-us/library/ms644990(v=vs.85).aspx
Et voici l'article KB sur la façon de le faire à partir de C #
http://support.microsoft.com/kb/318804
Cet article va dans quelques détails aussi: http: //www.codeguru .com / colonnes / vb / article.php / c4829
Je me attends à votre application sera pris par divers logiciels espions / logiciels antivirus comme enregistreur de clavier, cependant.
Bonne chance.