Delphi获得一个进程的主窗体(GetWindow(AHandle, GW_OWNER)等于0的窗体才是主窗体,并且要IsWindowVisible排除Application窗口)
2017-01-24 23:11
519 查看
type
TMainWindow = packed record
ProcessID: THandle;
MainWindow: THandle;
end;
PMainWindow =^ TMainWindow;
[align=left]function IsMainWindow(AHandle: THandle): Boolean;[/align]
[align=left]begin[/align]
[align=left] Result :=(GetWindow(AHandle, GW_OWNER) = 0) and (IsWindowVisible(AHandle));[/align]
[align=left]end;{ IsMainWindow }[/align]
[align=left] [/align]
[align=left]function fFindMainWindow(hWnd: THandle; lParam: PMainWindow): BOOL; stdcall;[/align]
[align=left]var[/align]
[align=left] vProcessID: THandle;[/align]
[align=left]begin[/align]
[align=left] GetWindowThreadProcessId(hWnd, vProcessID);[/align]
[align=left] if (lParam^.ProcessID = vProcessID) and IsMainWindow(hWnd) then[/align]
[align=left] begin[/align]
[align=left] lParam^.MainWindow := hWnd;[/align]
[align=left] Result := False;[/align]
[align=left] end else Result := True;[/align]
[align=left]end;[/align]
[align=left] [/align]
[align=left]function FindMainWindow(AProcessID: THandle): THandle;[/align]
[align=left]var[/align]
[align=left] vMainWindow: TMainWindow;[/align]
[align=left]begin[/align]
[align=left] vMainWindow.ProcessID := AProcessID;[/align]
[align=left] vMainWindow.MainWindow := 0;[/align]
[align=left] EnumWindows(@fFindMainWindow, Integer(@vMainWindow));[/align]
[align=left] Result := vMainWindow.MainWindow;[/align]
[align=left]end;{ FindMainWindow }[/align]
[align=left] [/align]
[align=left]procedure TForm1.Button1Click(Sender: TObject);[/align]
[align=left]begin[/align]
[align=left] Caption := Format('Application.Handle: %d, FindMainWindow(): %d',[[/align]
[align=left] Application.Handle, FindMainWindow(GetCurrentProcessId)]);[/align]
[align=left]end;[/align]
http://blog.csdn.net/zswang/article/details/1598516
TMainWindow = packed record
ProcessID: THandle;
MainWindow: THandle;
end;
PMainWindow =^ TMainWindow;
[align=left]function IsMainWindow(AHandle: THandle): Boolean;[/align]
[align=left]begin[/align]
[align=left] Result :=(GetWindow(AHandle, GW_OWNER) = 0) and (IsWindowVisible(AHandle));[/align]
[align=left]end;{ IsMainWindow }[/align]
[align=left] [/align]
[align=left]function fFindMainWindow(hWnd: THandle; lParam: PMainWindow): BOOL; stdcall;[/align]
[align=left]var[/align]
[align=left] vProcessID: THandle;[/align]
[align=left]begin[/align]
[align=left] GetWindowThreadProcessId(hWnd, vProcessID);[/align]
[align=left] if (lParam^.ProcessID = vProcessID) and IsMainWindow(hWnd) then[/align]
[align=left] begin[/align]
[align=left] lParam^.MainWindow := hWnd;[/align]
[align=left] Result := False;[/align]
[align=left] end else Result := True;[/align]
[align=left]end;[/align]
[align=left] [/align]
[align=left]function FindMainWindow(AProcessID: THandle): THandle;[/align]
[align=left]var[/align]
[align=left] vMainWindow: TMainWindow;[/align]
[align=left]begin[/align]
[align=left] vMainWindow.ProcessID := AProcessID;[/align]
[align=left] vMainWindow.MainWindow := 0;[/align]
[align=left] EnumWindows(@fFindMainWindow, Integer(@vMainWindow));[/align]
[align=left] Result := vMainWindow.MainWindow;[/align]
[align=left]end;{ FindMainWindow }[/align]
[align=left] [/align]
[align=left]procedure TForm1.Button1Click(Sender: TObject);[/align]
[align=left]begin[/align]
[align=left] Caption := Format('Application.Handle: %d, FindMainWindow(): %d',[[/align]
[align=left] Application.Handle, FindMainWindow(GetCurrentProcessId)]);[/align]
[align=left]end;[/align]
http://blog.csdn.net/zswang/article/details/1598516
相关文章推荐
- Delphi获得一个进程的主窗体
- Delphi中一个获得窗口图象的函数
- Delphi中一个获得窗口图象的函数
- 进程句柄HANDLE获得进程主窗口的句柄HWND
- Delphi使用TObject类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good
- 启动一个进程并获得其主窗口句柄
- 在delphi中如何判断一个文件正在被其它的程序或进程所调用?
- 如何获得指定进程的主窗口
- 如何通过一个毫不相关的进程去控制另一进程窗口中数据
- vb调用vc的dll挂钩指定窗口,并且跨进程子类化该窗口
- 一个获得窗口图象的函数
- C#中出现了一个问题,就是程序主窗体已经打开,在调用子窗体时候出现了创建窗口句柄时出错。
- 获得前一个窗口的引用(windows.opener)
- 在ASP.NET中一个弹出信息窗口及获得焦点的函数
- .NET CF中激活属于另外一个进程或程序的窗体
- C#一个渐变并且消失的窗体
- 如何由进程句柄得到一个窗体句柄
- 如何使一个窗口强制激活在最前端并且可以填写表单?
- DELPHI中进程、窗口句柄、文件属性、程序运行状态
- delphi编写搜索进程函数的一个奇怪的现象(已解决)