2008-09-27 7 views
1

J'ai écrit une application qui a une forme modale. Comment puis-je m'assurer que ce formulaire ne perd pas le focus même lorsqu'une autre application est démarrée?Garder le focus sur une application

+0

Je suppose ce est une application web. Est-ce exact? –

Répondre

10

En fait, c'est exactement ce que vous ne devriez pas faire.

Il y a trop de programmes qui supposent qu'ils contrôlent l'ordinateur sur lequel ils sont installés. C'est l'utilisateur de votre application qui devrait être en contrôle. C'est pourquoi les versions ultérieures de Windows n'autorisaient pas le vol de mise au point, insistant simplement sur le clignotement de l'entrée dans la barre de liste des tâches.

Vous pourriez bien trouver un moyen de le faire (bien que j'en doute), mais je vous invite à le repenser. Je serais intéressé de savoir pourquoi vous pensiez que c'était nécessaire.

+0

J'ai écrit une application pour écouter les stations de radio Web pendant que je suis sur mon vélo ergomètre. Je peux changer les stations en appuyant sur un bouton de la manette qui est fixé sur l'ergomètre. Lorsque l'application de l'application est perdue, je ne peux plus utiliser la manette de jeu. –

+0

Pourquoi? Comment lisez-vous les données de la manette de jeu? – OregonGhost

+0

J'utilise le directX-Framework. Lorsque l'application est perdue, je ne peux plus lire les données. –

3

Vous pouvez définir la propriété "Topmost" sur true pour conserver le formulaire devant tous les autres, mais cela ne permet pas de conserver le focus.

0

Vous devez rendre le système de dialogue modal.

+0

"Vous devez utiliser le système de dialogue modal."doit être reformulé pour être plus clair – John

0

J'utilise

SetForegroundWindow(Me.Handle) 

Me.Handle est la poignée de votre formulaire.

Vous devez déclarer ce qui suit quelque part dans votre classe ou WinForm, mais pas à l'intérieur d'une fonction

Declare Unicode Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As IntPtr) As Boolean 

vous pourriez avoir besoin de lancer un minuteur et SetForegroundWindow sur chaque tick de dire 10 secondes, en fonction de votre préférence.

EDIT: Il fonctionne pour moi, si elle n'ajoute pas les éléments suivants

Declare Unicode Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoW" (ByVal uiAction As Int32, ByVal uiParam As Int32, ByRef pvParam As Int32, ByVal fWinIni As Int32) As Int32 

Et entourent SetForegroundWindow avec ces

Dim _timeout As Int32 
    SystemParametersInfo(&H2000, 0, _timeout, 0) 
    SystemParametersInfo(&H2001, 0, 0, 3) 
    SetForegroundWindow(Me.Handle) 
    SystemParametersInfo(&H2001, 0, _timeout, 2) 

C'est le dernier recours

+0

Ne fonctionnera pas depuis XP, heureusement. –

Questions connexes