J'essaie de trouver un moyen fiable d'activer / de définir la concentration sur une fenêtre d'une application externe à l'aide de C #. Je tente actuellement d'atteindre cet article en utilisant les appels de l'API Windows suivants:
SetActiveWindow(handle); SwitchToThisWindow(handle, true);
4 Réponses :
Si tout est interne dans votre application, vous pouvez obtenir la fenêtre parent ou cette fenêtre, puis activez-la (VB Désolé):
Malheureusement, ce n'est pas dans ma demande. C'est une application externe que je ne peux pas accéder au code de. Je vais clarifier dans mon post. Merci pour votre effort.
Vous devez utiliser Coin attacherthreadInput code>
Windows créés dans différents threads traitent généralement l'entrée de manière indépendante les unes des autres. C'est-à-dire qu'ils ont leurs propres états d'entrée (focus, actifs, fenêtres de capture, état clé, état de la file d'attente, etc.), et ils ne sont pas synchronisés avec le traitement des entrées d'autres threads. En utilisant la fonction de connexion, un thread peut fixer son traitement d'entrée à un autre thread. Cela permet également des threads de partager leurs états d'entrée afin qu'ils puissent appeler la fonction SETFOCUS pour définir la mise au point du clavier sur une fenêtre d'un fil différent. Cela permet également des threads d'obtenir des informations sur l'état clé. Ces capacités ne sont généralement pas possibles. P> BlockQuote>
Je ne suis pas sûr des ramifications de l'utilisation de cette API à partir de formulaires Windows (probablement). Cela dit, je l'ai utilisé en C ++ pour obtenir cet effet. Le code serait quelque chose comme suit: p>
xxx pré>
targethwnd code> étant le
hwnd code> de la fenêtre que vous souhaitez définir de la fenêtre. . Je suppose que vous pouvez utiliser la ou les signatures P / invoke puisque vous utilisez déjà des API natales. P> P>
Votre message était très informatif. Merci beaucoup. Je vais essayer cela dès que j'aurai une chance de. J'ai la signature P / invoquée vers le bas, je n'ai jamais vraiment compris la photo complète derrière les files d'entrée, mais vous le mettez assez clairement. :)
Merci! Je viens de terminer écrire une application simple qui est utile pour les raccourritiques, appelé Openorswitchto. Fondamentalement, lorsqu'il est invoqué avec un nom EXE (openorswitchto.exe c: \ path \ to \ somap.exe) si SOMAPP.exe est en cours d'exécution, il s'allume afin que vous puissiez commencer à l'utiliser, et sinon, il démarrera SOMAPP .EXE. J'ai essayé d'au moins une demi-douzaine de méthodes pour passer à la fenêtre (SwitchtothisWindow, ShowWindow, apportwindowtotop, Serforegroundwindow, etc.). Votre code a finalement travaillé, avec un appel rapide à ShowWindow pour restaurer la fenêtre si elle a été minimisée en premier.
Pour moi (Windows 7), la solution avec attacheTthreadInput () code> ne fonctionne pas. J'ai résolu le problème en laissant le autre thread i> définir sa fenêtre de propriétaire sur le thread actuel i>, puis je peux simplement
setactivewindow () code>. Voir mon blog Post Code.fitness/ Post / 2017/09 / ...
J'ai utilisé cela pour donner l'accent à une fenêtre d'inspecteur Outlook, mais utilisée SetFocus () code> au lieu de
setingactivewindow () code>. J'utilise C # Winforms sans ramifications. Merci pour le post
[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); This one worked for me
hwnd_WhoRecvFocus.ShowWindow( SW_MINIMIZE ) hwnd_WhoRecvFocus.ShowWindow( SW_RESTORE )
Envisager d'ajouter une brève description de votre code et de la manière dont il résout la question