Page 1 sur 1

handle de l'editeur purebasic

Publié : sam. 11/déc./2010 0:29
par falsam
Je souhaite lancer un outil personnalisé depuis le menu outil de l'éditeur Pure Basic.

Est t'il possible de connaitre le handle de l'éditeur au moment ou je lance cet outil ?

J'utilise le code ci-dessous mais qui s’avère non fiable si par exemple mon explorateur internet affiche un sujet PureBasic.

Code : Tout sélectionner

hWnd.l = FindWindow_( 0, 0 ) 
chaine.s = Space(256) 

While hWnd <> 0 
  If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE 
     GetWindowText_(hWnd,@chaine,256)    
    If FindString(chaine,"PureBasic",0)<>0 
      Debug Str(hwnd)+" = "+chaine
    EndIf
  EndIf 
  hWnd = GetWindow_(hWnd, #GW_HWNDNEXT) 
Wend

Re: handle de l'editeur purebasic

Publié : sam. 11/déc./2010 0:59
par Backup
....................

Re: handle de l'editeur purebasic

Publié : sam. 11/déc./2010 1:03
par falsam
je suis d'accord sur ton code mais le problème est que le titre de l’éditeur Pure Basic peut changer en fonction des versions.

Re: handle de l'editeur purebasic

Publié : sam. 11/déc./2010 3:17
par falsam
J'ai trouvé ma réponse dans l'utilisation de la variable PB_TOOL_MainWindow qui donne l'identifiant système (Handle) de la fenêtre principale de l'IDE Pure Basic ainsi que dans l'utilisation de la variable PB_TOOL_Scintilla qui me donne l'identifiant système (Handle) du composant d'édition de code Scintilla pour le source en cours.

Re: handle de l'editeur purebasic

Publié : sam. 11/déc./2010 16:09
par PAPIPP
@DOBRO
Intéressant ce code, J’ai voulu intégrer l'exécution du prg calc «Calculatrice»
Mais il faut temporiser pour que le système puisse détecter le Handle

Code : Tout sélectionner

RunProgram("calc")
While hwincalc=0
Delay(10)
hWinCalc = FindWindow_ (vbNullString, "Calculatrice" )
Debug hWinCalc 
Wend
Delay(1000) ; Pour avoir le temps de voir le déplacement
; CallDebugger
xw=100
yw=300
SetWindowPos_ (hWinCalc, -1, xw, yw, 0, 0, #SWP_NOSIZE )
@+

Re: handle de l'editeur purebasic

Publié : sam. 11/déc./2010 16:27
par Backup
sur mon escargot de nc10, j'ai pas besoin de temporiser ! :roll: :lol:

Re: handle de l'editeur purebasic

Publié : sam. 11/déc./2010 19:39
par Le Soldat Inconnu
avec ce code, on peut trouver le nom du programme à partir du Handle d'une fenêtre. Il reste plus qu'a trouvé la fenêtre qui correspond à PureBasic.exe

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.5
;
; Explication du programme :
; Trouver le nom du programme à partir de l'ID d'une fenêtre

Procedure.s ProgramfileNameFromWindow(WindowID)
  Protected ProcessID, Process32, Snapshot, ProcessEntry.PROCESSENTRY32, ProgramfileName.s
  GetWindowThreadProcessId_(WindowID, @ProcessID)
  
  Process32 = OpenLibrary (#PB_Any, "kernel32.dll") 
  If Process32
    Snapshot = CallFunction (Process32, "CreateToolhelp32Snapshot", #TH32CS_SNAPPROCESS, 0) 
    If Snapshot 
      ProcessEntry\dwSize = SizeOf(PROCESSENTRY32) 
      If CallFunction (Process32, "Process32First", Snapshot, @ProcessEntry) 
        Repeat
          If ProcessID = ProcessEntry\th32ProcessID 
            ProgramfileName = PeekS(@ProcessEntry\szExeFile)
            Break
          EndIf
        Until CallFunction (Process32, "Process32Next", Snapshot, @ProcessEntry) = 0
      EndIf    
      CloseHandle_(Snapshot) 
    EndIf 
    CloseLibrary(Process32) 
  EndIf 
  ProcedureReturn ProgramfileName
EndProcedure






; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 30, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0 Or CreateGadgetList(WindowID(0)) = 0
  End
EndIf

StickyWindow(0, 1)

TextGadget(0, 5, 5, 290, 20, "")

AddWindowTimer(0, 1, 100)

Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Timer
      Select EventTimer()
        Case 1
          Fenetre = WindowFromPoint_(DesktopMouseX() | DesktopMouseY() << 32)
          Texte.s =ProgramfileNameFromWindow(Fenetre)
          SetGadgetText(0, Texte)
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
          
      EndSelect
  EndSelect
  
Until Event = #PB_Event_CloseWindow

KillTimer_(WindowID(0), 1)

End


Re: handle de l'editeur purebasic

Publié : sam. 11/déc./2010 23:29
par falsam
L'objectif est de cet exemple est de codé un outils personnalisé pour l'éditeur Pure Basic.

L'outils va renvoyer une valeur au point d'insertion du curseur de l'éditeur Pure Basic.

Enregistrer et créer un exécutable de l'exemple (sans intérêt) ci-dessous et installer le comme outils personnalisé pour voir le résultat.

Code : Tout sélectionner

Enumeration
  #MainForm
  #Insert
EndEnumeration

;Handle du composant d'édition de code Scintilla pour le source en cours
Global HandleIDESci.l

OpenWindow(#MainForm, 0, 0, 300, 200, "Outils personnalisé")
ButtonGadget(#Insert, 200, 20, 80, 22, "Inserer")

Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Insert
          ;Récupération du handle du source en cours d'édition (composant Scintilla)
          SetClipboardText("Résultat renvoyé par l'outils personnalisé")
          HandleIDESci=Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))
          SendMessage_(HandleIDESci, #WM_PASTE,0,0) 
         
      EndSelect
    
    Case #PB_Event_CloseWindow
      End
      
  EndSelect
ForEver

Re: handle de l'editeur purebasic

Publié : dim. 12/déc./2010 0:21
par falsam
Un exemple plus complet (Boite à outils Police) en cliquant sur ce post http://www.purebasic.fr/french/viewtopi ... =6&t=11290