PDA

View Full Version : ْبدست آوردن Window Handle از Proccess Handle



A.Nemati
سه شنبه 05 آذر 1387, 10:47 صبح
سلام
در جايي از برنامه‌ام كاربر فايل‌هاي الصاق شده را با يك كليك باز مي‌كند. از آنجاييكه فايل الصاف شده از هر نوعي مي‌تواند باشد، براي باز كردنشان از فرمان ShellExecute استفاده كردم.
سوال اينجاست كه چگونه مي‌توانم هندل پنجره باز شده فايل را بدست بياورم؟
البته فكر كردم كه ممكن است ShellExecuteEX كمك كند اما خروجي مفيد آن hProcess است كه هندل Process مي‌باشد. حال اگر بتوانم hProcess را به Window Handle تبديل كنم،‌مشكل حل مي‌شود.

arash_ebrahimi_nk
سه شنبه 05 آذر 1387, 12:17 عصر
از طریق نام یا هندل پروسه میشه به پنجره های ساخته شده توسط اون دسترسی پیدا کرد؛ بدین ترتیب که ابتدا به شمارش thread ها پرداخته (کد برای enumerate thread در اینترنت موجود هست) و در همین حین یعنی به هنگام شمارش و پیدا شدن هر thread به شمارش پنجره های اون thread از طریق کد EnumThreadWindows پرداخت.
مثال

// Start> Search for unique window between all top-level windows of OwnerProcess
var
WndUniqueInfoS: String;
PublicParentHandle: THandle;
function SearchUniqueWindow(OwnerProcess, WndUniqueInfo: string): THandle;

function EnumThreadWndProc(LocalParentHandle: THandle; lParam: Integer): Boolean; stdcall;
begin
if WndUniqueInfoS = GetWindowUniqueInfo(LocalParentHandle) then begin
PublicParentHandle := LocalParentHandle;
Result := False;
end else
Result := True;
end;

var
hThreadSnap: THandle;
te32: TThreadEntry32;
OwnerProcessID: DWORD;
begin
OwnerProcessID := GetProcessID(OwnerProcess);
WndUniqueInfoS := WndUniqueInfo;
PublicParentHandle := 0;

hThreadSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if hThreadSnap <> INVALID_HANDLE_VALUE then
try
ZeroMemory(@te32, SizeOf(TThreadEntry32));
te32.dwSize := SizeOf(TThreadEntry32);
if Thread32First(hThreadSnap, te32) then
repeat
if te32.th32OwnerProcessID = OwnerProcessID then
EnumThreadWindows(te32.th32ThreadID, @EnumThreadWndProc, 0);
until not Thread32Next(hThreadSnap, te32);
finally
CloseHandle(hThreadSnap);
end;
Result := PublicParentHandle;
end;
// End> Search for unique window between all top-level windows of OwnerProcess