Hallo zusammen...
ähm.. irgendwie stehe ich schon wieder an
Ich möchte an die WNDCLASS-Struktur der Klasse eines bestimmten Fensters kommen, das sicht nicht in meiner Anwendung befindet! Die funktion GetClassInfo erwartet als Parameter das
Handle zu dem Module / Instanz, das die Klasse erzeugte (hInstance). Die einzige Möglichkeit, die ich gefunden habe, um an ein soches
Handle zu kommen, ist die funktion GetModuleHandle!? Das ist auch schon meine erste Frage.. gibt es evtl eine andere Möglichkeit an dieses
handle zu kommen? Die Funktion GetModuleHandle erwartet wiederum als Parameter den Modul Name, den ich folgendermassen erhalte:
Delphi-Quellcode:
function GetModuleName(wndHandle: THandle): String;
var
winVersion: TOSVersionInfo;
hProcess: THandle;
processId: Cardinal;
processEntry32: TProcessEntry32;
b: Boolean;
begin
Result := '';
winVersion.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(winVersion);
GetWindowThreadProcessId(wndHandle, @processId);
if(winVersion.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, processId);
if not (hProcess = INVALID_HANDLE_VALUE) then begin
try
SetLength(Result, 400);
SetLength(Result, GetModuleFileNameEx(hProcess, 0, PChar(Result), Length(Result)));
finally
CloseHandle(hProcess);
end;
end;
end else begin
hProcess := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if not (hProcess = INVALID_HANDLE_VALUE) then begin
try
processEntry32.dwSize := SizeOf(processEntry32);
b := Process32First(hProcess, processEntry32);
while b do begin
if processEntry32.th32ProcessID = processId then begin
result := String(processEntry32.szExeFile);
Break;
end;
b := Process32Next(hProcess, processEntry32);
end;
finally
CloseHandle(hProcess);
end;
end;
end;
end;
Wenn sich das Fenster in meiner Anwendung befindet funktioniert das auch! GetModuleHandle gibt mir mit dem ModuleName das selbe
Handle zurück, wie die Konstance hInstance! Wenn sich das Fenster aber nicht in meiner Anwendung befindet, gibt GetModuleHandle 0 zurück, der ModuleName stimmt aber! Auf
Msdn.com habe ich folgenden Text gefunden:
Zitat:
The GetModuleHandle function retrieves a module
handle for the specified module if the file has been mapped into the address space of the calling process.
Ich denke, dass es nicht funktioniert, weil die Datei nicht in meinem Process "gemappt" ist aber... ich weiss nicht, wie ich das machen kann!?
Hat jemand von euch evtl. schon mal so etwas gemacht!
Vielen Dank für eure Hilfe und Grüsse.. Dominic