gpt4 book ai didi

windows - 所有者和拥有的窗口激活问题

转载 作者:行者123 更新时间:2023-12-03 11:05:24 26 4
gpt4 key购买 nike

在实验代码中,当创建三个具有分层所有权的顶级窗口时,我在以相反的顺序关闭它们时看到奇怪的行为 .

代码:

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
MSG msg;
WNDCLASS wndClass;
WCHAR className[] = L"OwnedWindowsWeirdness";

wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.lpszMenuName = NULL;
wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WndProc;
wndClass.lpszClassName = className;
wndClass.style = CS_HREDRAW | CS_VREDRAW;

if(!RegisterClassW(&wndClass))
{
MessageBoxW(0, L"Unable to register class...Exiting!", className, MB_OK);
return -1;
}

HWND hwnd1 = CreateWindowW(className, L"Main Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 400,
NULL, 0, hInstance, 0);
HWND hwnd2 = CreateWindowW(className, L"Main Window > Window 2", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
hwnd1, 0, hInstance, 0);

HWND hwnd3 = CreateWindowW(className, L"Main Window > Window 2 > Window 3", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,
hwnd2, 0, hInstance, 0);

ShowWindow(hwnd1, SW_SHOWNORMAL);
UpdateWindow(hwnd1);

ShowWindow(hwnd2, SW_SHOWNORMAL);
UpdateWindow(hwnd2);

ShowWindow(hwnd3, SW_SHOWNORMAL);
UpdateWindow(hwnd3);

while(GetMessage(&msg, 0,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
// Subdeveloper: Purposefully not complicating the code by calling PostQuitMessage/etc!
// In absence of which, this test application will need to be closed using
// task manager

return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

上面的代码是这样做的:
  • 创建顶级窗口 Main Window
  • 创建另一个顶级窗口 Window 2并将其所有者指定为 Main Window
  • 创建另一个顶级窗口 Window 3并将其所有者指定为 Window 2
  • 如果您仔细观察,所有这些都是非模态的,但拥有正确的所有权

  • 现在当这个应用程序运行时( Release built, run on Windows 10 x64 ),我们以相反的顺序关闭窗口,在关闭 Window 2 之后激活消失到现有 Notepad window 。

    可以在以下屏幕截图中看到该行为:

    enter image description here

    我想知道发生了什么。通常,当我们错过设置正确的所有权时会发生这种行为!

    其次,当我四处寻找时,我确实看到焦点转到了 Default IME窗口有时(即 Windows 输入法编辑器)。我认为每个带有 UI 的应用程序都为 IME 分配了一个默认窗口?如果是这样,也许我一创建 Main Window ,创建一个 IME 窗口,然后在我下次调用 CreateWindowW 时, 其他 2 个拥有的窗口被创建,从而更改顶级窗口列表中的 sibling ?目前这只是一种推测。

    有人可以解释一下吗,对此的“无黑客”解决方法是什么?

    最佳答案

    添加其他 WS_POPUP窗口 2 的样式(或使用 WS_CAPTION | WS_POPUPWINDOW 替换 WS_OVERLAPPEDWINDOW 。)为我解决了这个问题。
    WS_POPUP ,所有权将被选中,您将看到您期望的行为。无 WS_POPUP ,系统会找下一个窗口激活,这个是无证的。

    关于windows - 所有者和拥有的窗口激活问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60377627/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com