8
votes

Existe-t-il un moyen fiable d'activer / de définir la mise au point sur une fenêtre à l'aide de C #?

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);


0 commentaires

4 Réponses :


1
votes

Si tout est interne dans votre application, vous pouvez obtenir la fenêtre parent ou cette fenêtre, puis activez-la (VB Désolé): XXX


1 commentaires

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.



8
votes

Vous devez utiliser Coin attacherthreadInput

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.

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: xxx

targethwnd étant le hwnd 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.


4 commentaires

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 () ne fonctionne pas. J'ai résolu le problème en laissant le autre thread définir sa fenêtre de propriétaire sur le thread actuel , puis je peux simplement setactivewindow () . 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 () au lieu de setingactivewindow () . J'utilise C # Winforms sans ramifications. Merci pour le post



4
votes
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);
This one worked for me

0 commentaires

0
votes
        hwnd_WhoRecvFocus.ShowWindow( SW_MINIMIZE )
        hwnd_WhoRecvFocus.ShowWindow( SW_RESTORE )

1 commentaires

Envisager d'ajouter une brève description de votre code et de la manière dont il résout la question