ouvrir femer forcer programme externe

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

ouvrir femer forcer programme externe

Message par david »

Bonjour,

Avec un programme, je fais un COPIER d'informations à l'écran
et j'ouvre notepad pour y COLLER les informations (comme ça je les récupère en texte brut pour traitement dans excel sans lien....)
le problème c'est qu'après je n'arrive pas à le refermer (il faudrait forcer sa fermeture même s'il y a eu des modifications sans le message 'voulez-vous enregistrer les modifications....'

je pense que j'ai raté qq chose d'essentiel mais quoi????


je suis débutant, mais je m'arrache les cheveux là!!!
j'ai un exemple avec Calculatrice, il me donne le numéro mais ne veux pas la fermer
et un exemple avec notepad, là il ne trouve même pas le numéro

Code : Tout sélectionner

Global hwnd


ProcedureDLL.s Donner_ID(ExternalWindowName$)
   hwnd = FindWindow_(0,ExternalWindowName$)
  If hwnd=0 
    MessageRequester(Str(hwnd),ExternalWindowName$+ " introubable")
  Else
    MessageRequester(Str(hwnd),ExternalWindowName$)
  EndIf
  
   EndProcedure   


   
   
   RunProgram("Calc.exe")
   Delay(1000)
   
   Donner_ID("Calculatrice")
   
   
   KillProgram(hwnd)
   
   
   
   

Code : Tout sélectionner

Global hwnd


ProcedureDLL.s Donner_ID(ExternalWindowName$)
   hwnd = FindWindow_(0,ExternalWindowName$)
  If hwnd=0 
    MessageRequester(Str(hwnd),ExternalWindowName$+ " introubable")
  Else
    MessageRequester(Str(hwnd),ExternalWindowName$)
  EndIf
  
   EndProcedure   


   
   
   RunProgram("notepad")
   Delay(1000)
   
   Donner_ID("Sans titre - Bloc-notes")
   
   

KillProgram(hwnd)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: ouvrir femer forcer programme externe

Message par Kwai chang caine »

Entre débutants ..on va essayer de se débrouiller :wink:
Sauf que moi j'suis un tres vieux débutant :oops: un peu un débutausaure :mrgreen:

Bon alors commencont par le "commençage"
Déjà tu t'es fait avoir comme moi des centaines de fois par un faux espace
L'un d'eux n'est pas un 32, au "zeuille" ça se voit pas...mais le PC qui sait toujours tout :? il le voit
C'est pourquoi, ton FindFenetre_() y trouve pas :D

Pour la phrase :
Sans titre - Bloc-notes

Les bons codes ASCII

Code : Tout sélectionner

00000000:   83
00000001:   97
00000002:   110
00000003:   115
00000004:   32
00000005:   116
00000006:   105
00000007:   116
00000008:   114
00000009:   101
0000000A:   32
0000000B:   45
0000000C:   32
0000000D:   66
0000000E:   108
0000000F:   111
00000010:   99
00000011:   45
00000012:   110
00000013:   111
Le tiens (Note le -196 à la place du 32)

Code : Tout sélectionner

00000000:   83
00000001:   97
00000002:   110
00000003:   115
00000004:   32
00000005:   116
00000006:   105
00000007:   116
00000008:   114
00000009:   101
0000000A:   -96
0000000B:   45
0000000C:   32
0000000D:   66
0000000E:   108
0000000F:   111
00000010:   99
00000011:   45
00000012:   110
00000013:   111
Fait tres attention au FindFenetre_(), il est trés trés chatouilleux, il faut exactement que tu mettes le bon texte, à la virgule prés...
Le mieux est de te procurer un code qui t'énumére la liste des fenetres en cours, que tu trouveras sur les forums, comme ça t'es obligé d'avoir le bon titre. :idea:
Ou bien des giciels freeware comme winexplorer de nirsoft ou autres qui te lisent toutes les fenetres ou autres process ouverts
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: ouvrir femer forcer programme externe

Message par Kwai chang caine »

le problème c'est qu'après je n'arrive pas à le refermer (il faudrait forcer sa fermeture même s'il y a eu des modifications sans le message 'voulez-vous enregistrer les modifications....'
Pour ça si tu kill le process de ton programme, c'est que tu y vas "sans vaseline"
C'est sur que tu ne lui laisse pas trop le choix de te demander de sauvegarder...ou le nom de ta belle-soeur...

C'est efficace, mais pas la meilleure méthode pour fermer une appli
Apres pour le pilotage des applis exterieures, tu as l'OLE en utilisant la lib open source COMATE de SROD, que tu trouveras sur le forum US, mais il faut que cette derniere utilise le COM (Component object model) comme excel, word enfin tout OFFICE et LOTUS, et plein d'autres applis.
Tu peux aussi envoyer un message close à l'appli avec l'API SendMessage_() tu trouveras aussi des exemples sur les forums...
Voila..je t'ai dit tout ce que je savais...tu vois tout mon savoir tiens en quelques lignes :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: ouvrir femer forcer programme externe

Message par TazNormand »

Salut

Code : Tout sélectionner

SendMessage_(hwnd,#WM_DESTROY,'','')
Un peu brute comme méthode, mais efficace :mrgreen:

PS : à mettre à la place de ton KillProgram()
Image
Image
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: ouvrir femer forcer programme externe

Message par david »

Je n'y arrive toujours pas malgré vos explications / j'ai toujours zéro !!!

Code : Tout sélectionner

NomApp.s=Chr(83)+Chr(97)+Chr(110)+Chr(115)+Chr(32)+Chr(116)+Chr(105)+Chr(116)+Chr(114)+Chr(101)+Chr(32)+Chr(45)+Chr(32)+Chr(66)+Chr(108)+Chr(111)+Chr(99)+Chr(45)+Chr(110)+Chr(111)+Chr(116)+Chr(101)+Chr(115)
hwndee= FindWindow_(0,NomApp)
MessageRequester(NomApp,Str(hwndee))
L'idéal serait d'avoir un code qui liste les fenetres ouvertes, que je puisse selectionner celle que je veux, mais je ne sais pas comment on peut récupérer le chainage ascii pour avoir le bon NomApp
J'ai un bout de code (je ne sais plus qui en est l'auteur), mais je n'arrive pas à l'adaper

Merci pour votre aide

Code : Tout sélectionner

Enumeration
  #FEN_0
  #G_TEXT_FEN_A_CAPTURER:#G_COMBO_FEN_A_CAPTURER
  #G_BUTTON_EXECUTER:#G_BUTTON_QUITTER
   
EndEnumeration

#Fichier=0

Structure STRU_INFO_GADGET
  win.l
  className$
  ctrl_id$
EndStructure

;EnableExplicit

Global FEN_X.w,FEN_Y.w,FEN_WIDTH.w,FEN_HEIGHT.w, numero_gadget.w, hauteur_barreTitre.w

Procedure.l EnumChildWindowProc(hwnd.l, *cg.STRU_INFO_GADGET)
  Protected classe$, chaine$, rc.RECT, style.l
  Protected GDT_X.w,GDT_Y.w,GDT_WIDTH.w,GDT_HEIGHT.w
  Protected chaine_sortie.s,chaine_coords.s,ctrlid$
   
  If GetParent_(hWnd) = *cg\win
    classe$=Space(100)
    chaine$=Space(255)
    GetClassName_(hwnd, @classe$, 100)
    GetWindowText_(hwnd,@chaine$,255)
    GetWindowRect_(hwnd,@rc)
    style=GetWindowLong_(hwnd,#GWL_EXSTYLE)
    ctrlid$=Str(GetWindowLong_(hwnd,#GWL_ID))
      
    GDT_X = rc\left-FEN_X-2*GetSystemMetrics_(#SM_CYBORDER) : GDT_Y = rc\top-FEN_Y-hauteur_barreTitre : GDT_WIDTH = rc\right-rc\left : GDT_HEIGHT = rc\bottom-rc\top
    chaine_coords = Str(GDT_X)+","+Str(GDT_Y)+","+Str(GDT_WIDTH)+","+Str(GDT_HEIGHT)
   
    Debug classe$
   
    If classe$ = "ComboBox"
      classe$ = "ComboBoxGadget"
      chaine_sortie = classe$+"("+Str(numero_gadget)+","+chaine_coords+")"
      ;;,"+ Chr(34) +chaine$+ Chr(34)
    EndIf
    If classe$ = "Static"
      classe$ = "textgadget"
      chaine_sortie = classe$+"("+Str(numero_gadget)+","+chaine_coords+","+ Chr(34) +chaine$+ Chr(34) +")"
    EndIf
    If classe$ = "Edit"
      classe$ = "stringgadget"
      chaine_sortie = classe$+"("+Str(numero_gadget)+","+chaine_coords+","+ Chr(34) +chaine$+ Chr(34) +")"
    EndIf
    If classe$ = "Button"
      classe$ = "buttongadget"
      chaine_sortie = classe$+"("+Str(numero_gadget)+","+chaine_coords+","+ Chr(34) +chaine$+ Chr(34) +")"
    EndIf
         chaine_sortie+" ; CTRL_ID="+ctrlid$
    WriteStringN(#Fichier, chaine_sortie)
   
    numero_gadget+1
  EndIf
  ProcedureReturn 1
EndProcedure


Procedure.l FEN0_INIT()
  Protected col.w=5, lig.w=5
  #fen_larg = 810 : #fen_haut = 100
  #text_larg = #fen_larg/3-10 : #text_haut = 16
  #combo_larg = #fen_larg-#text_larg-10 : #combo_haut = 20

  If OpenWindow(#FEN_0,0,0,#fen_larg,#fen_haut,"Capture Gadget v1.0",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
     TextGadget(#G_TEXT_FEN_A_CAPTURER,col,lig+2,#text_larg,#text_haut,"Choisir la fenêtre : ",#PB_Text_Right)
    ComboBoxGadget(#G_COMBO_FEN_A_CAPTURER,col+#text_larg,lig,#combo_larg,#combo_haut)
    lig+30
    lig+40
     col = #fen_larg-#text_larg/1.5
    ButtonGadget(#G_BUTTON_QUITTER,col,lig,#text_larg/1.5-5,#combo_haut,"Quitter")
    col = GadgetX(#G_BUTTON_QUITTER)- #text_larg/1.5
    ButtonGadget(#G_BUTTON_EXECUTER,col,lig,#text_larg/1.5-5,#combo_haut,"Executer") 
  EndIf

  ProcedureReturn WindowID(#FEN_0)
EndProcedure

Procedure FEN0_EXEC()
  Protected event.l, evgad.l , quit.b = 0, nom_fichier.s = ""
  Protected hwnd.l, chaine.s = Space(256)

  ;{ auteur : dlolo
  ;; purebasic forum french : http://www.purebasic.fr/french/viewtopic.php?t=3622&start=0&postdays=0&postorder=asc&highlight=list+process
  hWnd = FindWindow_( 0, 0 )

  While hWnd <> 0
    If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE
      If GetWindowLong_(hWnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW
        GetWindowText_(hWnd,@chaine,256)       
        If chaine <> ""
          AddGadgetItem(#G_COMBO_FEN_A_CAPTURER,-1,chaine) ;Str(hwnd) = n°
        EndIf
      EndIf
    EndIf
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
   Wend
  ;} fin
   
   Repeat
    event = WaitWindowEvent()
   
    Select event
      Case #PB_Event_Gadget
        evgad = EventGadget()
        Select evgad
          Case #G_COMBO_FEN_A_CAPTURER
         
            
          Case #G_BUTTON_EXECUTER
            
            msg$= GetGadgetText(#G_COMBO_FEN_A_CAPTURER)
          MessageRequester(nom_fichier, msg$)
           
          Case #G_BUTTON_QUITTER
            quit = 2
           
        EndSelect
   
      Case #PB_Event_CloseWindow
        quit = 1
       
    EndSelect
   
  Until quit>0
EndProcedure


programm_affich_destinations:
If FEN0_INIT()>0
  FEN0_EXEC()
EndIf
End
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: ouvrir femer forcer programme externe

Message par david »

bon la question n'étais pas digne, même d'un débutant
l'exemple string.pb est assez light, mais je suis content d'avoir trouvé!
reste plus qu'à adapter...

merci pour vos conrtibutions

Code : Tout sélectionner

chaine$="bonjour"
longeur = Len(chaine$)


For i=1 To longeur
  
  
  
  
  carractere.s = Mid(chaine$, i, 1)
  ascii = Asc(carractere)
  
  
  MessageRequester(carractere, Str(Asc(carractere)))
  
  
  texte.s = texte + Str(ascii) + " / "
  

Next i

MessageRequester(texte, texte)

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

Re: ouvrir femer forcer programme externe

Message par falsam »

Un bout de code qui liste les applications actives et qui permet de fermer une application sélectionnée dans la liste.

Code : Tout sélectionner

EnableExplicit

Enumeration Window
  #Mainform
EndEnumeration

Enumeration Gadget
  #ListProcess
  #Refresh
  #Kill
EndEnumeration

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Handle.i

;Show active process
Procedure ProcessRefresh()
  Protected Handle.l, Buffer.s
  
  Handle = FindWindow_( 0, 0 ) 
  Buffer = Space(256) 
  
  ClearGadgetItems(#ListProcess)
  
  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(#ListProcess, -1, Buffer+" ("+Str(Handle)+")")
          SetGadgetItemData(#ListProcess, CountGadgetItems(#ListProcess)-1, Handle) 
        EndIf 
     EndIf 
    EndIf 
    Handle = GetWindow_(Handle, #GW_HWNDNEXT) 
  Wend
EndProcedure

;Kill Process
Procedure ProcessKill()
  Protected handle = GetGadgetItemData(#ListProcess, GetGadgetState(#ListProcess))
  
  Debug Handle
  If Handle <> -1 And Handle <> 0
    PostMessage_(Handle, #WM_CLOSE, 0, 0)
    ProcessRefresh()
  Else
    MessageRequester("Information", "Vous n'avez pas sélectionné une application.")
  EndIf
 
EndProcedure

;MainForm Open
Procedure MainForm_Open()
  OpenWindow(#Mainform, 0, -13, 500, 191, "Applications actives", WindowStyle)
  ListIconGadget(#ListProcess, 5, 10, 490, 140, "Applications", 390, #PB_ListIcon_FullRowSelect)
  ButtonGadget(#Refresh, 125, 155, 80, 22, "Refresh")
  ButtonGadget(#Kill, 298, 155, 80, 22, "Kill")
  
  StickyWindow(#Mainform, #True)
  
  ProcessRefresh()
  
  BindGadgetEvent(#Refresh, @ProcessRefresh())
  BindGadgetEvent(#Kill, @ProcessKill())
EndProcedure

MainForm_Open()
 
Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
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%
Répondre