使WinAPI提供的MessageBox位于父窗口的中间

刚刚遇到了需要让Windows API提供的MessageBox位于父窗口中间这个需求, 查阅资料得知MessageBox几乎都是写死的, 需要用钩子hook其激活事件, 然后调用MoveWindow或者SetWindowPos函数设置对话框的位置, 代码如下:

#include <Windows.h>
HWND parent; // 这个是父窗口的句柄
HHOOK hHook;
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
HWND hWnd = (HWND) wParam;
if (nCode == HCBT_ACTIVATE)
{
RECT rect, rect2;
GetWindowRect(parent, &rect);
GetWindowRect(hWnd, &rect2);
long x = (rect.left + rect.right) / 2 - (rect2.right - rect2.left) / 2;
long y = (rect.top + rect.bottom) / 2 - (rect2.bottom - rect2.top) / 2;
MoveWindow(hWnd, x, y, rect2.right - rect2.left, rect2.bottom - rect2.top, TRUE);
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
int WCMessageBox(HWND hwnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
hHook = SetWindowsHookEx(WH_CBT, CBTProc, NULL, GetCurrentThreadId());
int ret = MessageBox(hwnd, lpText, lpCaption, uType);
UnhookWindowsHookEx(hHook);
return ret;
}

使用方法也非常简单, 直接把MessageBox换为WCMessageBox即可, 如下所示:

WCMessageBox(NULL, L"内容", L"标题", MB_YESNO); // 第一个参数不需要传父窗口句柄进去, 应把上面的parent设为父窗口的句柄

另外遇到了一个坑就是如果使用SetWindowPos函数设置对话框位置那么对话框是无法取得焦点的, 目前还不知道为啥.

总而言之, 这只是在纯WindowsAPI环境下的歪门邪道罢了, 如果您使用MFC, 那么请使用自定义的对话框而不应该使用Windows提供的对话框.

标题: 使WinAPI提供的MessageBox位于父窗口的中间
作者: QingChenW
链接: https://dawncraft.cc/2021/07/213/
本文遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可
禁止商用, 非商业转载请注明作者及来源!
上一篇
下一篇
隐藏