Page 1 sur 1
lancer un programme par double clic
Publié : jeu. 07/nov./2013 17:52
par david
bonjour,
je cherche à donner le focus d'une fenêtre à une autre à chaque nouveau double-clic
mes fenêtres sont identifiables par leur nom
pour éviter que ça merdouille en cas de double clic bureau j'aurais dit:
En cas de double-clic:
- si fenetre1 à le focus donne le focus à fenetre2
- si fenetre2 à le focus donne le focus à fenetre1
si quelqu'un a des idées... j'arrive a gérer le numéro de la fenêtre par son nom et donner le focus a une fenetre
le gros problème c'est comment dire : quand la souris subie un double-clic faire ça!
merci pour votre aide, je suis débutant
ps : j'utilise PB4.51
Re: lancer un programme par double clic
Publié : jeu. 07/nov./2013 18:50
par Noos88
Essais ca :
Code : Tout sélectionner
Titre$ = "Essais 1 fenetre"
Procedure.b ActivatePrevInstance(title.s)
; Recherhce du nom de la fenêtre.
Protected hwnd
hwnd = FindWindow_(#Null, title)
If hwnd
ShowWindow_(hwnd, #SW_SHOWNORMAL)
SetForegroundWindow_(hwnd)
End ;On ferme le programme
EndIf
ProcedureReturn #False
EndProcedure
ActivatePrevInstance(Titre$); Verifie si la fenetre n'est pas deja ouverte
If OpenWindow(0, 0, 0, 220, 100, Titre$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget (1, 10, 60, 200, 30, "Fermer")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
CloseWindow(0)
End
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
Re: lancer un programme par double clic
Publié : ven. 08/nov./2013 10:15
par david
j'arrive à effectuer une opération avec le code trouvé sur le forum
j'aurais voulu qu'il permette de gérer le double-clic
(j'ai essayé en imbriquant une deuxième partie de programme de lui dire : si on clic , compte=compte+1:gosub partie2_va_voir_si_reclic )
mais c'est le bordel!!
Code : Tout sélectionner
Dim Key.s($FE)
Repeat
Delay(50)
For i=0 To $FE
Key=GetAsyncKeyState_(i)
If Key=-32767
If i=#VK_LBUTTON Or i=#VK_RBUTTON
MessageRequester("","clic pressée ")
Else
Debug i
EndIf
EndIf
Next i
ForEver
Re: lancer un programme par double clic
Publié : ven. 08/nov./2013 10:48
par Backup
Re: lancer un programme par double clic
Publié : ven. 08/nov./2013 12:39
par david
merci beaucoup dobro
c'est tellement bien quand c'est simple!
Re: lancer un programme par double clic
Publié : mar. 12/nov./2013 10:37
par david
par contre "Event = WaitWindowEvent()" ne marche qu'avec "OpenWindow"
sinon j'ai adapté ça (bon je sais qu'on n'aime pas les goto mais bon, ça à l'air de fonctionner...):
Code : Tout sélectionner
Dim Key.s($FE)
Repeat
suite_avant_clic:
Delay(50)
Key=GetAsyncKeyState_(1)
If Key<>-32767 :Goto suite_avant_clic:EndIf
suite_clic:
; MessageRequester("","par2")
For waiting=0 To 50:Delay(10)
Key=GetAsyncKeyState_(1)
If Key=-32767 : MessageRequester("","double clic gauche pressée "): EndIf
Next waiting
ForEver
Re: lancer un programme par double clic
Publié : mar. 12/nov./2013 11:01
par Backup
david a écrit :par contre "Event = WaitWindowEvent()" ne marche qu'avec "OpenWindow"
parceque sous windows , c'est l'attente des evenements ... tout marche avec cette boucle sous windows ...
tu veux l'utiliser dans quel contexte ?
Re: lancer un programme par double clic
Publié : mar. 12/nov./2013 11:57
par david
En fait j'ai deux pages 'internet' ouvertes dans deux navigateurs (contrainte professionnelle! c'est un lien de la première page qui ouvre la deuxième, impossible de travailler en onglets... (et le pb aurait été le même en moins pire)).
Je dois très (très) souvent passer de l'une à l'autre et c'est chiant de déplacer la souris jusqu'en bas pour sélectionner dans tous les trucs ouverts la deuxième fenêtre.
Quand je lance mon code je veux qu'en cas de double-clic il passe d'une fenêtre à lautre (si elle est ouverte naturellement)
La partie du code que j'ai posté ci-dessus peux convenir (reste plus qu'à identifier les handle de mes fenêtres par leur nom en vérifiant qu'elles existent et basculer le focus de l'une à l'autre en cas de double-clic.
ps: par contre il faudrait modifier mon délai pour que l'action "double-clic" soit plus précise, même si ça à l'air 'a peu près) de fonctionner
Re: lancer un programme par double clic
Publié : mar. 12/nov./2013 12:11
par Ar-S
pour l'histoire des handles il y a de nombreux codes sur le forum, tu peux aussi utiliser un lib (DroopyLib) qui propose plein de commande relatives aux handles/PID ...
ps: par contre il faudrait modifier mon délai pour que l'action "double-clic" soit plus précise, même si ça à l'air 'a peu près) de fonctionner
Je serai toi je partirai sur une Variable FENETRE_EX.b par exemple. Un CallBack servirait à détecter les doubles clics selon le schema suivant en français
Si double clic => si FENETRE_EX = 1 alors FENETRE_EX-1 sinon FENETRE_EX + 1 => Donne le focus à fenêtredi(FENETRE_EX) FinSi FinSi
Re: lancer un programme par double clic
Publié : mar. 12/nov./2013 12:54
par Backup
Ar-S a écrit :Si double clic => si FENETRE_EX = 1 alors FENETRE_EX-1 sinon FENETRE_EX + 1 => Donne le focus à fenêtredi(FENETRE_EX) FinSi FinSi
hum utiliser -1 et 1 c'est pas une bonne idée , car il peut se retrouver a 0 (un flag a 3 etats)
le mieux c'est 0 ou 1 ...
car que se passe t'il si FENETRE_EX n'est pas egale a 1 ??
par exemple : FENETRE_EX=-1
ta condition passe FENETRE_EX + 1 ce qui donne FENETRE_EX=0 ....
peut etre alors faire :
Si double clic => si FENETRE_EX <>0 alors FENETRE_EX=-FENETRE_EX Sinon FENETRE_EX=1
de cette façon si FENETRE_EX=1 ---> FENETRE_EX = -1
si FENETRE_EX=-1 ---> FENETRE_EX=1
une bascule qui marcherai meme si FENETRE_EX = 50

il n'y aurai plus qu'a tester si FENETRE_EX est superieur ou inferieur a 0
l'art des Flag par Lao-Dobro-Tseu

Re: lancer un programme par double clic
Publié : mar. 12/nov./2013 13:21
par david
bon, là je commence à être satisfait du résultat...
mais quand je double-clic il fait ce que je lui ai demandé mais on dirait qu'il reste en position "clic-appuyé" (quand je déplace la souris il met en surbrillance)
Il faudrait que j'arrange ça, si quelqu'un a une idée
Code : Tout sélectionner
Dim Key.s($FE)
Repeat
suite_avant_clic:
Delay(50)
Key=GetAsyncKeyState_(1)
If Key<>-32767 :Goto suite_avant_clic:EndIf
suite_clic:
; MessageRequester("","par2")
For waiting=0 To 20:Delay(10)
Key=GetAsyncKeyState_(1)
If Key=-32767 : Gosub va_executer_action: EndIf
Next waiting
ForEver
va_executer_action:
ExternalWindowName1$ = "fenetre1"
ExternalWindowName2$ = "fenetre2"
fenetre1 = FindWindow_(0,ExternalWindowName1$)
fenetre2 = FindWindow_(0,ExternalWindowName2$)
id_en_cours = GetForegroundWindow_()
If id_en_cours =fenetre1:SendMessage_(fenetre1,#WM_SYSCOMMAND, #SC_MINIMIZE,0):SendMessage_(fenetre2,#WM_SYSCOMMAND, #SC_RESTORE,0): SendMessage_(fenetre2,#WM_SYSCOMMAND, #SC_MAXIMIZE,0):Return:EndIf
If id_en_cours =fenetre2:SendMessage_(fenetre2,#WM_SYSCOMMAND, #SC_MINIMIZE,0):SendMessage_(fenetre1,#WM_SYSCOMMAND, #SC_RESTORE,0): SendMessage_(fenetre1,#WM_SYSCOMMAND, #SC_MAXIMIZE,0):Return:EndIf
Re: lancer un programme par double clic
Publié : mar. 12/nov./2013 17:19
par falsam
david a écrit :En fait j'ai deux pages 'internet' ouvertes dans deux navigateurs (contrainte professionnelle! c'est un lien de la première page qui ouvre la deuxième, impossible de travailler en onglets... (et le pb aurait été le même en moins pire)).
Ces deux pages sont visibles depuis un navigateur "maison" ou des navigateurs classiques ?
Si navigateur classique, lequel ?
Re: lancer un programme par double clic
Publié : mar. 12/nov./2013 17:58
par david
je suis sous windows7 professionnel
Il utilise internet explorer 9 pour ce qui est des pages en questions
Par contre je n'ai pas la barre de titre modifiable ni d'onglets, ni accès à beaucoup d'options
J'ai installé Firefox et GoogleChrome mais ça ne marche pas correctement (je pense que le site vérifie par quel navigateur il est utilisé en plus des paramètres utilisateurs....)
Re: lancer un programme par double clic
Publié : jeu. 14/nov./2013 1:22
par falsam
J’espère que j'ai bien compris le sens de ta demande.
Ce code permet de visualiser et de choisir les applications qui feront parti d'un ring applicatif. Tu pourras toujours double-cliquer sur la fenêtre pour basculer d'une application à une autre (
Objet de ta demande) mais le mieux est de presser la
touche Control. Ça m'a semblé plus pratique.
La
touche F8 permet de cacher ou montrer la fenêtre contenant la liste des applications.
Code : Tout sélectionner
;Ring Manager
; Permet de créer un ring applicatif manuel à partir des applications en cours d'application
;
; - Sélectionner les applications faisant parti du ring
; - Touche Control pour les faire défiler manuellement
; - Touche F8 pour cacher ou afficher Ring Manager
EnableExplicit
Enumeration Window
#Mainform
EndEnumeration
Enumeration Gadget
#ListApp
#Refresh
EndEnumeration
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Event.l, GEvent.l, TEvent.l, CurrentItem.i
Global MainFormStatus.b, Handle.i
;Liste des application en cours d'éxécution
;Appel : #Refresh
Procedure ListApplicationsRefresh()
Protected Handle.l, Buffer.s
Handle = FindWindow_( 0, 0 )
Buffer = Space(256)
ClearGadgetItems(#ListApp)
CurrentItem=-1 ;Le scan de la listicon commencera à la ligne 0
While Handle <> 0
If GetWindowLong_(Handle, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE
If GetWindowLong_(Handle, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW
GetWindowText_(Handle,@Buffer,256)
If Buffer <> ""
AddGadgetItem(#ListApp, -1, Buffer+" ("+Str(Handle)+")")
SetGadgetItemData(#ListApp, CountGadgetItems(#listapp)-1, Handle)
EndIf
EndIf
EndIf
Handle = GetWindow_(Handle, #GW_HWNDNEXT)
Wend
EndProcedure
;Prochaine application du ring à mettre au premier plan
;Appel : Double clic de la souris ou touche Control
Procedure GetNextApplicationHandle()
Protected N.i, Handle.i
For N = CurrentItem+1 To CountGadgetItems(#ListApp)-1
If GetGadgetItemState(#ListApp, N) = #PB_ListIcon_Checked Or
GetGadgetItemState(#ListApp, N) = #PB_ListIcon_Checked|#PB_ListIcon_Selected
CurrentItem = N
Handle = GetGadgetItemData(#ListApp, N)
If GetWindowLong_(Handle, #GWL_STYLE) & #WS_MINIMIZE
ShowWindow_(handle, #SW_RESTORE)
EndIf
EndIf
If handle<>0
Break
EndIf
Next
;? Fin du parcours
If N = CountGadgetItems(#ListApp)
CurrentItem=-1 ;Reprise du parcours de la listicon au début
EndIf
ProcedureReturn Handle
EndProcedure
;Gestionnaire de touches de racourcis
;Appel : Thread
Procedure keyPressManager(*Value)
Repeat
;F8 - Cache Ring Manager
If GetAsyncKeyState_(#VK_F8) & $1
If MainformStatus = #False
HideWindow(#MainForm, #False)
MainformStatus = #True
Else
HideWindow(#Mainform, #True)
MainformStatus = #False
EndIf
EndIf
;Ctrl - Bascule entres les applicartions du ring
If GetAsyncKeyState_(#VK_CONTROL) & $1
ShowWindow_(handle, #SW_MINIMIZE)
handle =0
Handle = GetNextApplicationHandle()
If handle = 0
Handle = GetNextApplicationHandle()
EndIf
SetForegroundWindow_(Handle)
EndIf
ForEver
EndProcedure
;Fenetre de l'application
Procedure Open_MainForm()
OpenWindow(#Mainform, 0, 0, 500, 230, "Ring Manager", WindowStyle)
ListIconGadget(#ListApp, 5, 10, 490, 140, "Applications", 390, #PB_ListIcon_CheckBoxes)
TextGadget(#PB_Any, 74, 185, 450, 20, "Cocher les cases des applications que vous souhaitez voir dans le ring.")
TextGadget(#PB_Any, 54, 205, 450, 20, "F8: Cache/Montre les applications - Ctrl : Bascule entre les applications du ring")
ButtonGadget(#Refresh, 210, 155, 80, 22, "Refresh")
StickyWindow(#Mainform, #True)
ListApplicationsRefresh()
MainformStatus = #True
CreateThread(@keyPressManager(), #Null)
EndProcedure
Open_MainForm()
Repeat
Event = WaitWindowEvent(10)
GEvent = EventGadget()
TEvent = EventType()
Select Event
Case #PB_Event_Gadget
Select GEvent
Case #Refresh
ListApplicationsRefresh()
EndSelect
Case #PB_Event_LeftDoubleClick
ShowWindow_(handle, #SW_MINIMIZE)
handle =0
Handle = GetNextApplicationHandle()
If handle = 0
Handle = GetNextApplicationHandle()
EndIf
SetForegroundWindow_(Handle)
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Re: lancer un programme par double clic
Publié : jeu. 14/nov./2013 8:46
par david
bon bah comme ça c'est fait!
c'est exactement ce que je recherchais (mais en mieux!)
et c'est vrai que Ctrl est aussi vite accessible
merci encore