我正在使用以下代码来获取最顶层窗口的句柄:
HWND hwnd;
hwnd = GetForegroundWindow();
这个问题是它返回了系统范围内最顶层的。 有没有什么方法可以从我自己的应用程序中获得最高的权限?
我想获得我应用程序的最顶层窗口。这意味着,我需要一个API来获取我自己的应用程序最顶层窗口而不是像GetForegroundWindow()那样的系统范围最顶层窗口。 谢谢!
修改
好的,让我在这里说清楚。我的问题是我能够获得不属于MY应用程序的窗口的HWND。 我想得到的只是我的应用程序的TOPMOST。 如果HWND属于另一个应用程序,那么我不应该获取信息。
答案 0 :(得分:4)
这是一个可以与EnumWindows()一起使用的回调:
BOOL CALLBACK FindTopmostWnd(HWND hwnd, LPARAM lParam)
{
HWND* pHwnd = (HWND*)lParam;
HWND myParent = hwnd;
do
{
myParent = GetParent(myParent);
}
while (myParent && (myParent != *pHwnd));
if (myParent != 0)
{
// If the window is a menu_worker window then use it's parent
TCHAR szClassName[7];
while (0 != GetClassName(hwnd, szClassName, 7)
&& 0 != _tcsncmp(szClassName, TEXT("Dialog"), 6)
&& 0 != _tcsncmp(szClassName, TEXT("Afx"), 3)
)
{
// find the worker's parent
hwnd = GetParent(hwnd);
}
*pHwnd = hwnd;
return FALSE;
}
return TRUE;
}
正如Adam指出的那样,传递给EnumWindows()的LPARAM应该是指向HWND的指针。所以你可能想做这样的事情:
HWND hTopmostWnd = hWnd;
EnumWindows(FindTopmostWnd, (LPARAM)&hTopmostWnd);
答案 1 :(得分:1)
使用GetTopWindow Function, 像这样:
HWND hwnd;
hwnd = GetTopWindow(NULL);
答案 2 :(得分:0)
我不知道有一个功能正是如此,但你可能自己写一个。如果您的应用程序窗口都有特定的窗口类,那么您可以使用FindWindow或FindWindowEx。
或者,您可以使用GetForegroundWindow从所有应用程序获取前景窗口,然后使用GetWindowLong检查HINSTANCE。如果它不是来自您的应用程序,那么继续按Z顺序枚举窗口(使用GetWindow),直到从应用程序中找到第一个窗口。