如何用windows Api判断是不是主窗口?

donkey301 2011-09-20 01:46:42
判断一个句柄是否为主窗口可以用两种方法
1. GetParent(hwnd) == NULL
2. GetWindows(hwnd, GW_OWNER) == NULL
具体:http://zwkufo.blog.163.com/blog/static/258825120104717513/
我发现这两种方法都不是很准确,有时对有时错。
请问有什么更精确的方法吗?多谢
...全文
217 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
donkey301 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 m617105 的回复:]

Delphi(Pascal) code

wndInfo=packed record
dwProcessId:DWORD;
hWind:HWND;
end;
LPWNDINFO=^wndInfo;

function EnumWindowsProc(
hwnd: HWND;
lParam: LPARAM
): BOOL; stdcall;
var
vProces……
[/Quote]
多谢,试了一下,GetWindowLong(hWnd,GWL_HWNDPARENT)和GetWindow(hWnd, GWL_OWNER)一样的结果,有些程序依然错误
浩南_哥 2011-09-20
  • 打赏
  • 举报
回复

wndInfo=packed record
dwProcessId:DWORD;
hWind:HWND;
end;
LPWNDINFO=^wndInfo;

function EnumWindowsProc(
hwnd: HWND;
lParam: LPARAM
): BOOL; stdcall;
var
vProcessID: THandle;
vBuffer: array[0..255] of Char;
nStyle:integer;
pInfo:LPWNDINFO;
begin
Result:= true;
GetWindowThreadProcessId(hwnd, vProcessID);
pInfo:=LPWNDINFO(lParam);
if vProcessID = pInfo.dwProcessId then
begin
nStyle:=GetWindowLong(hWnd,GWL_HWNDPARENT);
if nStyle=0 then
Result:=True
else
begin
pInfo.hWind:=nStyle;
Result:=FALSE;
end;
end;
end;
function GetProcessMainWnd(dwProcessId:DWORD):HWND;
var
Dwnd:wndInfo;
begin
wi.dwProcessId:=dwProcessId;
wi.wnd:=HWND(nil);
EnumWindows(@EnumWindowsProc,LPARAM(@Dwnd));
result:=Dwnd.hWind;
end;

MSDN上解释:
GWL_HWNDPARENT->Retrieves a handle to the parent window, if any.

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧