请教:查找进程中的句柄与用findwindow查找的结果不一致的原因
最近有个应用需要查找进程中的句柄,搜索了一些有价值的代码,但在使用时发现一个奇怪的现象,不知
各位老大有没有遇到过,或者是我处理不当造成的,还望指点。
测试用例:
1、先新建立一个空白的表单,表单的caption:='TestForm',编译成Test1.exe 测试结果两者相同
2、在表单上放置一个TtreeView控件,编译成Test1.exe 测试结果不一样
测试的主程序主要代码如下:
type // 存储窗体信息 PProcessWindow = ^TProcessWindow; TProcessWindow = record ProcessID: Cardinal; FoundWindow: hWnd; end;// 窗体枚举函数 function EnumWindowsProc(Wnd: HWND; ProcWndInfo: PProcessWindow): BOOL; stdcall;var WndProcessID: Cardinal;begin GetWindowThreadProcessId(Wnd, @WndProcessID); if WndProcessID = ProcWndInfo^.ProcessID then begin ProcWndInfo^.FoundWindow := Wnd; Result := False; end else Result := True;end; // 由 ProcessID 查找窗体 Handle function GetProcessWindow(ProcessID: Cardinal): HWND;var ProcWndInfo: TProcessWindow;begin ProcWndInfo.ProcessID := ProcessID; ProcWndInfo.FoundWindow := 0; EnumWindows(@EnumWindowsProc, Integer(@ProcWndInfo)); // 查找窗体 Result := ProcWndInfo.FoundWindow;end;function GetAppHandle(const AppFileName: string):HWND; //获取进程中的句柄var si: STARTUPINFO; pi: TProcessInformation;begin // 启动进程 FillChar(si, SizeOf(si), 0); si.cb := SizeOf(si); si.wShowWindow := SW_SHOW; if not CreateProcess(nil, PChar(AppFileName), nil, nil, true, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then Exit; // 等待进程启动 WaitForInputIdle(pi.hProcess, 10000); // 取得进程的 Handle result := GetProcessWindow(pi.dwProcessID); // 释放 Handle CloseHandle(pi.hProcess); CloseHandle(pi.hThread);end;//当Test1.exe主表单中没有ttreeview控件时,两者值相同//当Test1.exe主表单中有ttreeview控件时,两者的值不一样,procedure TFm_main.Button1Click(Sender: TObject);begin showmessage(intToStr(GetAppHandle('Test1.exe')));end;procedure TFm_main.Button2Click(Sender: TObject);begin showmessage(intToStr(FindWindow(nil,'TestForm')));end;