Win32 SetForegroundWindow non fiable
J'ai une assez complexe série d'applications qui dépendent de la capacité de basculer entre les applications en arrière-plan.
Mon problème est que, tous les 5 ou 6 fois de la commutation des applications au premier plan, tout simplement, il ne parvient pas à apporter de l'application de l'avant. GetLastError ne pas signaler les problèmes éventuels. Bien souvent, je vois le bon flash application au premier plan, pour un moment, puis la demande antérieure est visible.
J'ai une application de gestion que j'ai de la source, qu'elle engendre et des contrôles sur les 4 applications dont je n'ai pas de source pour. l'une des applications qu'elle engendre/commandes est également un gestionnaire, qui engendre le/les contrôles sur 5 applications.
C'est une sorte de kiosque de conception de sorte que l'utilisateur l'habitude même avoir un clavier ou une souris, il suffit d'un écran tactile.
J'ai essayé toutes les combinaisons des appels Win32 pour contrôler eux, je me suis juste des idées.
Ma première tentative a été:
SetWindowPos(hApp, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hApp, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
Ma deuxième tentative:
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
ma troisième tentative:
DWORD dwThreadID = GetWindowThreadProcessId(hApp, NULL);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), true);
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);
ma de suite la tentative:
DWORD dwThreadID = GetWindowThreadProcessId(hApp, NULL);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), true);
SetWindowPos(hApp, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hApp, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);
Je me sens comme je suis en manque d'un important gotcha quand il s'agit de la fenêtre de commutation. Je sais que seul le processus d'arrière-plan peut changer de fenêtres autour de lui, mais comme mon Gestionnaire principal du programme est de frai et de départ tous les autres processus que j'ai besoin de contrôler, j'ai l'impression que ça devrait être capable de déplacer ces fenêtres tout autour. Des suggestions ou des conseils est apprécié.
source d'informationauteur micheal blunning
Vous devez vous connecter pour publier un commentaire.
Votre AttachThreadInput() hack est (je pense) un moyen connu pour vaincre le vol de focus des contre-mesures dans Windows. Vous utilisez le mauvais poignée cependant, vous voulez joindre le thread qui a actuellement le focus. Ce qui ne sera pas hApp, vous n'auriez pas besoin de ce code sinon.
Utilisation GetForegroundWindow() pour obtenir le handle de la fenêtre ayant le focus.
Bien que je pense que le 2eme argument doit être l'ID de thread de hApp. Parce que vous ne voulez pas pousser votre propre fenêtre si j'ai bien compris. Vous ne savez pas si cela peut fonctionner.
J'ai eu le même problème et je ne voulais pas le gâcher avec des threads. À l'expérimentation, je l'ai observé un simple hack pour faire SetForegroundWindow() fonctionne de la manière attendue. Voici ce que j'ai fait:
Certaines fenêtres sont verrouillées avec setforeground(...),
vous avez besoin de les débloquer. Cette séquence est utile avec n'importe quelle fenêtre:
la classe et le nom de la fenêtre vous pouvez récupérer avec ranorexspy, par exemple, d'
nanoware.cz
Nous avons eu un problème similaire il y a quelques années. Nous avons pu résoudre par l'appel de fonction suivant:
Lui donner un essai. Consultez la documentation ici.
La solution la plus simple en C# pour afficher une fenêtre au premier plan:
Une fois que vous avez la poignée de la fenêtre, vous pouvez simplement appeler:
où
Essayer de pousser les autres fenêtres de l'application de l'arrière-plan de la première.
Aussi c'est un peu étrange que vous utilisez SetWindowPos (SWP) pour pousser une fenêtre au premier plan, puis la pousser hors de la forgreound avant d'utiliser SetForegroundWindow pour le ramener de l'avant. Personnellement, j'ai toujours utilisé le SWP méthode sans aucun problème ... mais j'ai toujours repoussé les autres fenêtres du bas.
Vous devez également considérer les chances de fenêtre réduite. Si la fenêtre ou de diverses application sont réduites alors SetForegroundWindow(hApp) ne fonctionne pas. Pour être sûr d'utiliser ShowWindow(hApp, 9); je préfère valeur de 9. Jetez un oeil à sa documentation et à choisir, vous trouverez bon pour vous.