Bonjour.
J'ai une application en Delphi 6 qui commande une interface "robotique", une seule fiche "FsStayOnTop". Dans la routine d'initialisation exécutée "OnCreate" se trouvent les deux instructions "Application.OnDeactivate := ... " et "Application.OnActivate := ..." qui pointent sur deux routines appropriées, cela fonctionne. Je voudrais savoir s'il existe une instruction "miracle" à inclure dans la routine de "Déactivation" qui permet immédiatement de reprendre le focus, bref qui empêcherait la "Déactivation". Wnd_Proc ne fonctionne pas correctement.
Merci d'avance,
Alberich
Focus d'une application en Delphi 6
dim, 04/08/2013 - 09:32
#1
Focus d'une application en Delphi 6
Bonjour alberich,
S'il est question de reprendre le focus immédiatement, je pense qu'il suffit d'appeler l'API SetActiveWindows depuis le gestionnaire d'événement OnDeactivate.
Bonjour.
J'ai défini une variable (privée) de type HWnd à laquelle j'ai donné la valeur Main.WindowHandle, Main étant ma fiche principale (et la seule fiche), successivement dans une routine associée aux événements "OnActivate" et "OnCreate" de Main. Dans la routine "Application.OnDeactivate" qui par ailleurs s'exécutait toujours normalement j'ai mis "SetActiveWindow:= {la valeur obtenue} ; eh bien, quand je clique en dehors de ma fiche, le "bouton" de la barre des tâches "sort" et ma fiche ne réagit plus aux raccourcis clavier (il y a un "OnKeyDown" qui est normalement exécuté) ... Donc ?
Bonjour,
Je ne comprends pas SetActiveWindow:= {la valeur obtenue} ;
Affecter une valeur ce qui doit normalement être une fonction, ou plutôt un pointeur de fonction ça ne peut pas aller
J'ai parlé d'invoquer une API Windows. Le code doit donc être quelque chose comme
SetActiveWindows(Le-HWND-de-la-fenetre-a-ramener-au-premier-plan);
Si ça se trouve, tout simplement
SetForegroundWindow(Application.MainForm.Handle);
pourrait macher aussi
Bonjour.
Ca rate encore ... J'ai obtenu la valeur du HWnd dans la routine d'initialisation exécutée lors de "on activate" de la fiche (si je le fais "on create" j'ai une violation d'accès), en essayant aussi bien par Application.Handle que Application.MainForm.Handle. L'instruction SetActiveWindow(la valeur) a été mise (en premier) dans la procedure définie dans cette routine d'initialisation par "Application.OnDeactivate". Le bouton de la barre des tâches sort toujours et le focus est perdu (mais le reste du "on deactivate" n'est plus exécuté"), l'appli ne réagit plus au "OnKeyDown" et je dois cliquer dans la fenêtre pour reprendre le focus et donc la main ... Seule différence, si j'utilise SetForegroundWindow, le bouton clignote plusieurs fois en bleu ... et le focus est perdu. Je me demande d'ailleurs si cette dernière instruction ne fait pas double emploi avec le FsStayOnTop... En définitive, je crains que Windows (2000) ne reste "le plus fort".
Cordialement,
Alberich
Bonjour,
Je pense qu'il y a un souci quelque part ailleurs dans ton code, mais bien sûr je ne peux pas te dire où sans en voir, du code.
Windows ne saurait être le plus fort sur ce coup. Maintenir une fenêtre en avant plan est assez courant. Par exemple, la fenêtre du gestionnaire des tâches de Windows est comme ça.
Les solutions que je t'ai indiquées doivent marcher, s'il n'y a pas un souci par ailleurs dans le code. Mais le mieux, pour autant que je me souvienne, est de mettre les bits de styles qui vont bien dans la classe de fenêtre (classe au sens Windows du terme, et PAS au sens objet Delphi, attention ! )
Il y a moyen de faire ça au moment de la création de la fenêtre en Delphi, mais je ne me souviens plus comment. (Ca fait plus de 10 ans que je n'ai pas codé en Delphi, désolé) Peut-être un événement PreCreateWindows, ou quelque chose comme ça.
Tu écris "le reste du ondesactivate n'est plus exécuté" A mon humble avis, il y a un pb dans ton code qui fait planter quelque part ou quelque chose
Mais ce qui est sûr, c'est qu'on peut faire ce que tu veux assez facilement et de plusieurs manières
Bonjour.
Je crains qu'il n'y ait une erreur de "communication". Il ne s'agit pas de maintenir une fenêtre en avant-plan, ce que le "FsStayOnTop" fait sans problème ; il s'agit de faire en sorte que la fenêtre reste la fenêtre active (celle qui "reçoit" les raccourcis clavier entre autres), même si on clique à l'extérieur sur le bureau (en général dans ce cas la barre "du haut" passe en gris avec le modèle classique de couleurs, moi je voudrais qu'elle reste en bleu quoiqu'il arrive). Evidemment, il reste la solution brutale de l'affichage plein écran (pour empêcher de cliquer à l'extérieur) et d'enlever les icônes de la fenêtre (ce que j'ai déjà fait) mais il reste toujours la solution vicieuse des raccourcis clavier, par exemple pour lancer l'aide de Windows ...
Le problème est bien compris dès le début.
Par contre on ne voit pas beaucoup de code :-)
La preuve qu'apparemment le problème n'est PAS compris, c'est que le gestionnaire de tâches est bien toujours en avant-plan, mais qu'il perd le focus si je lance par exemple l'explorateur en plus (qui se mettra "derrière")
Tant pis, j'arrête ce topic, je continue à faire (bien) exécuter mes codes en cas de déactivation/réactivation, il s'agit d'une commande "robotique" par raccourcis clavier qui doit s'arrêter en cas de perte de focus, ce qu'elle fait très bien, et dont on reprend le contrôle quand la fenêtre reprend le focus.
Merci pour tout ...
Alberich
bon ok je n'ai rien compris :D
Donc je ne suis pas qualifié pour aider et j'arrête aussi :D
Cependant il est dommage qu'aucun code n'ait été montré et qu'on puisse comprendre pourquoi une routine ne s'exécute pas jusqu'au bout.
Je dis ça à l'intention de tout le monde, montrer un peu de code sur un forum de programmation c'est toujours mieux :)
Bonjour,
Si j'ai bien compris ton problème tu veux que ta fenêtre garde le focus tout le temps.
Si c'est ça, alors ta fenêtre doit être affichée avec la méthode ShowModal.
Tu peux faire cela avec une fiche mais c'est un peu plus compliqué. Je te conseille d'avoir une fiche principale qui dans son évènement oncreate ou onshow demande la création de ta fiche actuelle (FsStayOnTop). La fiche qui est affichée par la méthode ShowModal ne laisse pas la main à une autre application tant qu'elle n'est pas fermée.
Je n'ai pas compris pourquoi tu utilises Application.Onxxx alors que tu dis que tu cliques en dehors de la fenêtre. Peut être que cela serait plus pratique sur les mêmes évènements de la fiche FsStayOnTop. Mais bon pas de source pour bien comprendre.
Tu évoques aussi OnKeyDown as-tu placé la propriété KeyPreview de la fiche sur True ?
Et si tu as trouvé une solution tient nous au courant.