刚刚遇到了需要让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提供的对话框.