lancer un programme par double clic
lancer un programme par double clic
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
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
Dernière modification par david le ven. 08/nov./2013 10:16, modifié 1 fois.
Re: lancer un programme par double clic
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
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!!
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
TUTO NUMERO 5 Section DEBUTANT
http://www.purebasic.fr/french/viewtopi ... =21&t=6664
http://www.purebasic.fr/french/viewtopi ... =21&t=6664
Re: lancer un programme par double clic
merci beaucoup dobro
c'est tellement bien quand c'est simple!
c'est tellement bien quand c'est simple!
Re: lancer un programme par double clic
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...):
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
parceque sous windows , c'est l'attente des evenements ... tout marche avec cette boucle sous windows ...david a écrit :par contre "Event = WaitWindowEvent()" ne marche qu'avec "OpenWindow"
tu veux l'utiliser dans quel contexte ?
Re: lancer un programme par double clic
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
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
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 ...

Si double clic => si FENETRE_EX = 1 alors FENETRE_EX-1 sinon FENETRE_EX + 1 => Donne le focus à fenêtredi(FENETRE_EX) FinSi FinSi
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çaisps: 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

Si double clic => si FENETRE_EX = 1 alors FENETRE_EX-1 sinon FENETRE_EX + 1 => Donne le focus à fenêtredi(FENETRE_EX) FinSi FinSi
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: lancer un programme par double clic
hum utiliser -1 et 1 c'est pas une bonne idée , car il peut se retrouver a 0 (un flag a 3 etats)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
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
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
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
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: lancer un programme par double clic
Ces deux pages sont visibles depuis un navigateur "maison" ou des navigateurs classiques ?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)).
Si navigateur classique, lequel ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: lancer un programme par double clic
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....)
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....)
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: lancer un programme par double clic
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.
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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: lancer un programme par double clic
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
c'est exactement ce que je recherchais (mais en mieux!)
et c'est vrai que Ctrl est aussi vite accessible
merci encore