lancer un programme par double clic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

lancer un programme par double clic

Message 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
Dernière modification par david le ven. 08/nov./2013 10:16, modifié 1 fois.
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: lancer un programme par double clic

Message 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
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: lancer un programme par double clic

Message 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 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: lancer un programme par double clic

Message par Backup »

david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: lancer un programme par double clic

Message par david »

merci beaucoup dobro
c'est tellement bien quand c'est simple!
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: lancer un programme par double clic

Message 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 
 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: lancer un programme par double clic

Message 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 ?
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: lancer un programme par double clic

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: lancer un programme par double clic

Message 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
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: lancer un programme par double clic

Message 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 :lol:
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: lancer un programme par double clic

Message 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



Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: lancer un programme par double clic

Message 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 ?
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%
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: lancer un programme par double clic

Message 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....)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: lancer un programme par double clic

Message 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
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%
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: lancer un programme par double clic

Message 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
Répondre