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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top