首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请问:查找进程中的句柄与用findwindow查找的结果不一致的原因

2012-03-14 
请教:查找进程中的句柄与用findwindow查找的结果不一致的原因最近有个应用需要查找进程中的句柄,搜索了一

请教:查找进程中的句柄与用findwindow查找的结果不一致的原因
最近有个应用需要查找进程中的句柄,搜索了一些有价值的代码,但在使用时发现一个奇怪的现象,不知
各位老大有没有遇到过,或者是我处理不当造成的,还望指点。

测试用例:
  1、先新建立一个空白的表单,表单的caption:='TestForm',编译成Test1.exe 测试结果两者相同

  2、在表单上放置一个TtreeView控件,编译成Test1.exe 测试结果不一样

测试的主程序主要代码如下:

Delphi(Pascal) code
 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;


  问题:为什么会因为窗体中多了一个Ttreeview控件,而出现两种方法读取的句柄值不一样?

[解决办法]
测试时关掉DELPHI

或者,你在窗体的oncreate事件中设置
caption := '{一个GUID}';
然后查找GUID

热点排行
Bad Request.