Existe-t-il des solutions pour empêcher les applications de voler le focus de la fenêtre active?
C’est particulièrement agaçant lorsque je démarre une application, changez d’action et la nouvelle application commence à recevoir une demi-phrase de texte.
windows
window-focus
svandragt
la source
la source
This is especially annoying when I'm starting an application, switch to do something else and the new application starts receiving half a sentence of text.
C'est encore plus gênant quand une boîte de dialogue s'ouvre et que vous la fermez par inadvertance sans même voir le message, car il vous est arrivé d'appuyer surSpace
ouEnter
en tapant une phrase.Réponses:
Cela n'est pas possible sans une manipulation poussée des composants internes de Windows et vous devez vous en remettre.
Il y a des moments d'utilisation quotidienne de l'ordinateur où il est vraiment important de faire une action avant que le système d'exploitation ne vous permette d'en faire une autre. Pour ce faire, vous devez vous concentrer sur certaines fenêtres. Sous Windows, le contrôle de ce comportement est en grande partie laissé aux développeurs des programmes individuels que vous utilisez.
Tous les développeurs ne prennent pas les bonnes décisions concernant ce sujet.
Je sais que c'est très frustrant et énervant, mais vous ne pouvez pas avoir votre gâteau et le manger aussi. Il y a probablement de nombreux cas dans votre vie quotidienne où tout va parfaitement bien, le focus étant déplacé vers un certain élément de l'interface utilisateur ou une application demandant que le focus reste verrouillé dessus. Mais la plupart des applications sont quelque peu égales lorsqu'il s'agit de décider qui dirige actuellement et le système ne peut jamais être parfait.
Il y a quelque temps, j'ai effectué des recherches approfondies sur la résolution de ce problème une fois pour toutes (et j'ai échoué). Le résultat de mes recherches est disponible sur la page du projet de désagrément .
Le projet inclut également une application qui tente à plusieurs reprises d’attirer l’attention en appelant:
Comme nous pouvons le voir dans cet extrait de code, mes recherches portaient également sur d'autres aspects du comportement de l'interface utilisateur que je n'aime pas.
J'ai essayé de résoudre ce problème en chargeant une DLL dans chaque nouveau processus et en raccordant les appels d'API qui activent une autre fenêtre.
La dernière partie est la plus facile, grâce à d’impressionnantes bibliothèques d’accrochage d’API. J'ai utilisé la très grande bibliothèque mhook :
D'après mes tests à l'époque, cela a très bien fonctionné. À l'exception de la partie du chargement de la DLL dans chaque nouveau processus. Comme on peut l’imaginer, rien n’est à prendre à la légère. J'ai utilisé l' approche AppInit_DLLs à l'époque (ce qui n'est tout simplement pas suffisant).
Fondamentalement, cela fonctionne très bien. Mais je n'ai jamais trouvé le temps d'écrire quelque chose qui injecte correctement ma DLL dans de nouveaux processus. Et le temps investi dans ceci masque en grande partie le désagrément que me cause le vol de la cible.
En plus du problème d'injection de DLL, il existe également une méthode de vol de focus que je n'ai pas abordée dans l'implémentation de Google Code. Un collègue a en fait fait des recherches supplémentaires et a couvert cette méthode. Le problème a été discuté sur le SO: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus
la source
jne
?Sous Windows 7, l'
ForegroundLockTimeout
entrée de registre n'est plus vérifiée, vous pouvez le vérifier avec Process Monitor. En fait, dans Windows 7, ils vous interdisent de modifier la fenêtre de premier plan. Allez lire sur ses détails , il est même là depuis Windows 2000.Cependant, la documentation est nulle et ils se poursuivent pour trouver une solution .
Il y a donc un problème avec
SetForegroundWindow
un bug ou des fonctions similaires de l'API ...Le seul moyen de le faire correctement consiste à créer une petite application qui appelle périodiquement
LockSetForegroundWindow
, en désactivant virtuellement tous les appels à notre fonction API buggy.Si cela ne vous suffit pas (un autre appel d'API bogué?), Vous pouvez aller encore plus loin et surveiller certaines API pour voir ce qui se passe, puis vous pouvez simplement connecter les appels d'API à chaque processus, après quoi vous pouvez vous débarrasser de tous les appels gâchés. le premier plan. Cependant, ironiquement, cela est découragé par Microsoft ...
la source
Il y a une option dans TweakUI qui le fait. Cela évite la plupart des astuces habituelles utilisées par les développeurs de logiciels douteux pour forcer la concentration sur leur application.
C'est une guerre d'armes en cours, donc je ne sais pas si ça marche pour tout.
Mise à jour : selon EndangeredMassa , TweakUI ne fonctionne pas sous Windows 7.
la source
Je pense qu’une certaine confusion peut exister, car il existe deux manières de "voler le focus": (1) une fenêtre qui s’affiche au premier plan et (2) la fenêtre qui reçoit des frappes au clavier.
Le problème dont il est question ici est probablement le deuxième, dans lequel une fenêtre revendique le focus en se plaçant au premier plan - sans demande ni autorisation de l'utilisateur.
La discussion doit être partagée ici entre XP et 7.
Windows XP
Dans XP, il existe un hack de registre qui permet à XP de fonctionner de la même manière que Windows 7 pour empêcher les applications de voler le focus:
HKEY_CURRENT_USER\Control Panel\Desktop
.ForegroundLockTimeout
et définissez sa valeur en hexadécimal sur30d40
.Windows 7
(La discussion ci-dessous s'applique principalement à XP également.)
S'il vous plaît, comprenez qu'il est impossible pour Windows d'empêcher totalement les applications de voler le focus et de rester fonctionnel. Par exemple, si pendant la copie d'un fichier, votre anti-virus a détecté une menace potentielle et souhaite afficher une fenêtre vous demandant de prendre l'action, si cette fenêtre est bloquée, vous ne comprendrez jamais pourquoi la copie ne se termine jamais.
Dans Windows 7, il n’ya qu’une modification possible du comportement de Windows lui-même, qui consiste à utiliser les piratages du registre focus-suiv-souris de MS-Windows , dans lesquels l’activation et / ou l’activation est toujours dirigée vers la fenêtre située sous le curseur. Un délai peut être ajouté pour éviter que des applications n'apparaissent sur le bureau.
Voir cet article: Windows 7 - Survol de la souris rendant la fenêtre active - Activer .
Sinon, il faut détecter et neutraliser le programme coupable: s’il s’agit toujours de la même application qui obtient le focus, cette application est programmée pour prendre le focus et l’empêcher cela peut être fait soit en le désactivant en commençant par l’ordinateur, ou utilisez certains paramètres fournis par cette application pour éviter ce problème.
Vous pouvez utiliser le script VBS inclus dans VB Code, qui identifie le focus , que l'auteur a utilisé pour identifier le coupable en tant que programme de mise à jour "Call Home" pour un logiciel d'impression.
Une mesure désespérée lorsque tout le reste échoue et, si vous avez identifié cette application mal programmée, consiste à la minimiser et à espérer que cela ne se présentera pas au premier plan. Une forme plus efficace de minimisation consiste à utiliser l'un des produits gratuits répertoriés dans Best Free Application Minimizer .
La dernière idée dans l’ordre du désespoir est de fractionner votre bureau virtuellement en utilisant un produit tel que Desktops ou Dexpot et d’effectuer votre travail sur un autre bureau que celui par défaut.
[MODIFIER]
Comme Microsoft a retiré la galerie d'archives, voici le code VB ci-dessus reproduit:
la source
Alt-Tab
fonctionne; forçant uniquement le dialogue au premier plan.Alt+Tab
liste et, selon mon expérience, une fenêtre a un dialogue modal ouvert ne montre pas toujours (jamais?) le dialogue modal avecAlt+Tab
, surtout si le dialogue n'a jamais eu un changement pour obtenir le focus.:-|
Ghacks a une solution possible:
la source
Inspiré par la réponse de Der Hochstapler , j'ai décidé d'écrire un injecteur de DLL, qui fonctionne avec les processus 64 et 32 bits et empêche le vol de focus sur Windows 7 ou une version plus récente: https://blade.sk/stay-focused/
Cela fonctionne normalement: il surveille les fenêtres nouvellement créées (avec
SetWinEventHook
) et injecte une DLL très similaire à celle de Der Hochstapler dans le processus de la fenêtre, si elle n’est pas déjà présente. Il décharge les DLL et restaure la fonctionnalité d'origine à la sortie.D'après mes tests, cela fonctionne très bien jusqu'à présent. Cependant, le problème semble aller plus loin que le simple fait d'appeler des applications
SetForegroundWindow
. Par exemple, lorsqu'une nouvelle fenêtre est créée, elle est automatiquement mise au premier plan, ce qui gêne également la saisie par un utilisateur dans une autre fenêtre.Pour traiter d'autres méthodes de vol de focus, davantage de tests sont nécessaires et j'apprécierais tout retour sur les scénarios dans lesquels cela se produit.
la source
J'ai compris comment empêcher la barre des tâches de flasher une fenêtre cible nouvellement activée après l'activation, la maximisation et la focalisation par programme de la fenêtre principale de ce processus à partir d'un autre processus. Tout d'abord, il y a beaucoup de restrictions quant à l'autorisation de cette opération.
Ainsi, si le processus de contrôle est au premier plan, il peut temporairement permettre à un autre processus de voler complètement le premier plan en appelant AllowSetForegroundWindow avec l' ID de processus du processus cible. Après cela, le processus cible peut appeler SetForegroundWindow lui-même, en utilisant son propre handle de fenêtre, et cela fonctionnera.
Évidemment, cela nécessite une certaine coordination entre les deux processus, mais cela fonctionne et si vous le faites pour implémenter une application à instance unique qui redirige tous les lancements de clics de l'Explorateur vers l'instance d'application existante, vous avez déjà avoir un tuyau nommé (par exemple) pour coordonner les choses quand même.
la source