Pinvoke SetFocus à un contrôle particulier

Question simple: est-il possible de définir le focus sur la zone de texte d’une autre application (en utilisant son nom de classe). J’ai la fenêtre comme un “intptr” etc etc mais juste besoin de quelques conseils sur ce que les fonctions / API sont disponibles pour cela!

Le problème, c’est que j’utilise l’API SetForegroundWindow pour obtenir le focus sur la fenêtre, mais cela ne me permettait pas d’envoyer les touches Ctrl + L pour se concentrer sur la zone de texte!

Toute aide est la bienvenue!

… autant que je m’en souvienne, c’est le code que j’ai dû utiliser pour que cela fonctionne – et qui a bien fonctionné sur mes applications, Windows plus récent, etc.

void SetFocus(IntPtr hwndTarget, ssortingng childClassName) { // hwndTarget is the other app's main window // ... IntPtr targetThreadID = WindowsAPI.GetWindowThreadProcessId(hwndTarget, IntPtr.Zero); //target thread id IntPtr myThreadID = WindowsAPI.GetCurrentThread(); // calling thread id, our thread id try { bool lRet = WindowsAPI.AttachThreadInput(myThreadID, targetThreadID, -1); // attach current thread id to target window // if it's not already in the foreground... lRet = WindowsAPI.BringWindowToTop(hwndTarget); WindowsAPI.SetForegroundWindow(hwndTarget); // if you know the child win class name do something like this (enumerate windows using Win API again)... var hwndChild = EnumAllWindows(hwndTarget, childClassName).FirstOrDefault(); if (hwndChild == IntPtr.Zero) { // or use keyboard etc. to focus, ie send keys/input... // SendInput (...); return; } // you can use also the edit control's hwnd or some child window (of target) here WindowsAPI.SetFocus(hwndChild); // hwndTarget); } finally { bool lRet = WindowsAPI.AttachThreadInput(myThreadID, targetThreadID, 0); //detach from foreground window } } 

… donc quelque chose dans ce sens (il fait ce dont vous avez besoin et dans le bon ordre, n’oubliez pas de vous détacher, etc. – mais vous auriez besoin de l’adapter à vos conditions spécifiques, de contrôler / modifier hwnd, etc. – et vous pouvez toujours avoir d’autres problèmes liés à la fenêtre / application cible, cela fonctionne pour la plupart, mais pas dans tous les cas, c’est une longue histoire et, comme je l’ai dit, dépend de votre scénario spécifique),

(WindowsAPI sont des wrappers typiques de PInvoke, je crois). En gros, vous devez vous attacher à un autre thread pour les opérations ‘input’. Je pense que ceci est une explication officielle. “Cela permet également aux threads de partager leurs états d’entrée afin de pouvoir appeler la fonction SetFocus le clavier se concentre sur une fenêtre d’un fil différent “. Google pour AttachThreadInput pour plus d’informations (pour connaître les raisons), et il est également souvent associé à SetFocus et à d’autres opérations de saisie / clavier. De plus, l’API d’automatisation pourrait aider comme suggéré – c’est la manière la plus «propre» de le faire – mais cela dépend du fait que l’application cible expose et gère correctement cette application – ce qui “n’existe pas encore” pour la plupart d’entre elles, pas cohérente, etc. – si vous voulez gérer votre “propre application” qui est différente, alors vous devez vous demander quel est le meilleur scénario, etc. espérons que cela vous aidera

remarque: il doit y avoir une douzaine de liens vers des solutions similaires (et sur SO), car il s’agit d’une chose assez connue, mais je ne parviens pas à trouver le bon lien.

EDIT: J’ai clarifié un peu pour votre cas spécifique et l’accent sur l’enfant
EDIT (2):
le code est un exemple pour cette spécification. cas et basé sur le code de travail – mais peut avoir besoin de tests et de l’élaboration de certains détails (qui semblent hors du champ de cette question), par exemple ..
WindowsAPI contient les signatures PInvoke pour l’API Windows et les appels natifs (similaire à MS.Win32.UnsafeNativeMethods). Il s’agit d’une classe statique (voir cette classe ou http://pinvoke.net/ – Accès également à Microsoft.Win32.UnsafeNativeMethods? ), Devrait être nommé (Safe / Unsafe) NativeMethods ( http://msdn.microsoft.com/en-us/library/ms182161.aspx ) – et voir aussi IntPtr, SafeHandle et HandleRef – Explained (IntPtr est un peu un “vieux” style)
EnumAllWindows utilise EnumChildWindows et GetClassName Win API (et je suppose que c’est une autre question) et nécessite une méthode d’encapsulation pour être utile (ce qui est EnumAllWindows – il énumère simplement à travers les fenêtres en vérifiant récursivement les noms de classe).