Kan du kan ikke se vi er inde for programmering i visual basic? hvis du så tænker dig lidt om tror du så ikke også at svaret jeg gerne vil have er en kode til visual basic der gør det automatisk ? Tænk dig lidt om før du skriver
Det du skal gøre, er først at få fat i process ID'et, som er associeret med EXE filnavnet. Derefter skal du finde processens hWnd, og sende en WM_DESTROY message til vinduet. Så skulle det gerne lukke.
Det kunne du f.eks. gøre med flg. kode. Kopier det ind i et modul, og du kan nu bruge KillProc(filnavn) til at lukke alle processer, som er startet af det bestemte exe navn, f.eks. KillProc("notepad.exe").
Const TH32CS_SNAPHEAPLIST = &H1 Const TH32CS_SNAPPROCESS = &H2 Const TH32CS_SNAPTHREAD = &H4 Const TH32CS_SNAPMODULE = &H8 Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) Const TH32CS_INHERIT = &H80000000 Const MAX_PATH As Integer = 260 Const WM_DESTROY = &H2
Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * MAX_PATH End Type Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Public procID As Long Public hWndToKill As Long
Sub KillProc(exeName As String) hWndToKill = 0 procID = 1 Dim procs As PROCESSENTRY32 Dim ans As Long, r As Long Dim hSnap As Long, exitCode As Long, hwnd As Long, tpID As Long Dim l As Integer
procs.dwSize = Len(procs) exeName = LCase(exeName) l = Len(exeName)
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&) ans = Process32First(hSnap, procs)
While (ans) procs.szExeFile = LCase(procs.szExeFile) If (exeName = Left(procs.szExeFile, l)) Then procID = procs.th32ProcessID r = EnumWindows(AddressOf EnumWindowsProc, ByVal 0&) r = SendMessage(hWndToKill, WM_DESTROY, exitCode, 0) CloseHandle hSnap Exit Sub End If ans = Process32Next(hSnap, procs) Wend
CloseHandle hSnap
End Sub
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean Dim z As Long, thisProc As Long z = GetWindowThreadProcessId(hwnd, thisProc)
If procID = thisProc Then hWndToKill = hwnd EnumWindowsProc = False ' stop enumeration Else EnumWindowsProc = True ' fortsæt enumeration End If
jah driss.. det var jo lige det jeg manglede.. Bemærkede dog den ikke virkede ved de fleste af mine programmer men det hjalp da jeg var lidt mere venlige ved dem.. byttede destroy ud med close.. altså : Const WM_CLOSE = &H10
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.