comme cela
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4
; Explication du programme :
; Ce code permet de fermer un programme à partir du nom de la fenêtre
Procedure.l FermeProgramme(Nom.s)
; nom = nom de la fenêtre en cours
; valeur de retour de la procedure :
; > 1 = OK
; > 0 = Erreur d'envoi du message d'arrêt au logiciel
; > -1 = Le logiciel n'est pas en cours d'exécution
resultat = 1
winHwnd = FindWindow_(vbNullString, Nom) ; Recherche de l'identifiant de la fenêtre
If winHwnd <> 0
If PostMessage_(winHwnd, #WM_CLOSE, 0, 0) = 0 ; Envoi d'un message de fermeture à la fenêtre
resultat = 0
EndIf
Else
resultat = -1
EndIf
ProcedureReturn
EndProcedure
RunProgram("Calc.exe")
Delay(3000)
FermeProgramme("Calculatrice")
; ProductName=%exe%
; ProductVersion=%date%
; CompanyName=LSI
; FileVersion=%date%
; InternalName=%exe%
; LegalCopyright=LSI
; OriginalFilename=%source%
; Web=http://www.lsi-dev.com
Pour retrouver le nom du programme en fonction de l'exe lancer, il faut utiliser ceci :
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
CompilerIf #PB_Compiler_Unicode
ProcessEntry\dwSize = SizeOf(PROCESSENTRY32)
If CallFunction(Process32, "Process32FirstW", Snapshot, @ProcessEntry)
Repeat
If ProcessID = ProcessEntry\th32ProcessID
ProgramfileName = PeekS(@ProcessEntry\szExeFile)
Break
EndIf
Until CallFunction(Process32, "Process32NextW", Snapshot, @ProcessEntry) = 0
EndIf
CompilerElse
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
CompilerEndIf
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
donc au final, tu scannes toutes les fenêtres ouvertes avec ce code :
Code : Tout sélectionner
Procedure Fenetres_Ouvertes()
hWnd.l = FindWindow_(0, 0)
While hWnd <> 0
If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE ; pour lister que les fenêtres visibles
; If GetWindowLong_(hWnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW ; pour lister que les fenêtres qui ne sont pas des ToolWindow ou barre d'outils
GetWindowThreadProcessId_(hWnd, @pid)
Debug pid
Debug hWnd
Txt.s = Space(256)
GetWindowText_(hWnd, Txt, 256)
If Txt <> ""
Debug Txt
Else
Debug "Sans nom"
EndIf
Debug ""
; EndIf
EndIf
hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
Wend
; EnumChildWindows_(FindWindow_(0, "Program manager"), @Fenetre_LieeAuBureau(), 0)
EndProcedure
Fenetres_Ouvertes()
pour chaque fenêtre, tu recupères le nom de l'exe avec le second code.
Si le nom de l'exe est celui recherché, tu demandes au programme de se fermer avec le premier code

tout ça tout ça. sauf si le premier code te suffit