@ts - soft,
Nagut, ich gebs zu, das ist jetzt schöner, schneller und mit Unicode - Unterstützung, dem habe ich nichts mehr entgegenzusetzen.
@Fluid Byte,
Ja, zuverlässiger, probiere das mal bei mehreren Fenstern.
1. Mit GetWindowModuleFilename:
Code: Alles auswählen
Procedure tp(hwnd, message, id, time)
Protected fn.s{260}
fhwnd = GetForegroundWindow_()
SendMessage_(fhwnd, #WM_GETTEXT, 260, @wt.s)
If GetWindowModuleFileName_(fhwnd, @fn, 260)
SetGadgetText(0, wt + " - " +fn)
Else
SetGadgetText(0, wt + " - " + "Fehlgeschlagen")
EndIf
EndProcedure
hwnd = OpenWindow(0, 0, 0, 600, 100, "WindowModuleFilename")
CreateGadgetList(hwnd)
StringGadget(0, 10, 40, 580, 20, "", #PB_String_ReadOnly)
StickyWindow(0, #True)
SetTimer_(hwnd, 0, 100, @tp())
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Und Mit Openprocess ...
Code: Alles auswählen
Import "psapi.lib"
EnumProcessModules(a.l,b.l,c.l,d.l) As "_EnumProcessModules@16"
CompilerIf #PB_Compiler_Unicode
GetModuleFileNameEx(hProcess.l, hModule.l, *lpFilename, nSize) As "_GetModuleFileNameExW@16"
CompilerElse
GetModuleFileNameEx(hProcess.l, hModule.l, *lpFilename, nSize) As "_GetModuleFileNameExA@16"
CompilerEndIf
EndImport
Procedure.s GetEXEFromHandle(nHWnd.l = 0)
Protected nProcID, nResult, nTemp, hProcess
Protected sFile.s
Dim lModules.l(200)
If nHwnd = 0
nHWnd = GetForegroundWindow_()
EndIf
; ProcessID ermitteln
If GetWindowThreadProcessId_(nHWnd, @nProcID) <> 0
; Prozess-Handle ermitteln
hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, nProcID)
If hProcess <> 0
; Module des Prozess enumerieren
nResult = EnumProcessModules(hProcess, @lModules(0), 200, @nTemp)
If nResult <> 0
; Dateiname ermitteln
sFile = Space(260)
nResult = GetModuleFileNameEx(hProcess, 0, @sFile, Len(sFile))
sFile = LCase(Left(sFile, nResult))
EndIf
; Handle schließen
CloseHandle_(hProcess)
EndIf
EndIf
ProcedureReturn sFile
EndProcedure
Procedure tp(hwnd, message, id, time)
Protected fn.s{260}
fhwnd = GetForegroundWindow_()
SendMessage_(fhwnd, #WM_GETTEXT, 260, @wt.s)
fn = GetEXEFromHandle(fhwnd)
If fn <> ""
SetGadgetText(0, wt + " - " +fn)
Else
SetGadgetText(0, wt + " - " + "Fehlgeschlagen")
EndIf
EndProcedure
hwnd = OpenWindow(0, 0, 0, 600, 100, "OpenProcess")
CreateGadgetList(hwnd)
StringGadget(0, 10, 40, 580, 20, "", #PB_String_ReadOnly)
StickyWindow(0, #True)
SetTimer_(hwnd, 0, 100, @tp())
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Wie du sehen wirst wird bei 1. Methode Fehlgeschlagen angezeigt wo die 2. Methode funktioniert.