如何在C ++中更改MessageBox的位置

时间:2019-03-13 20:24:59

标签: c++

void _MessageBox()
{
ResultMB = MessageBox(NULL, TEXT("MB!"), TEXT("Message"), MB_OK);
    if (ResultMB == IDOK)
    {
        for (int q = 1; q < 5; q++)
         {
            ResultMB = MessageBox(NULL, TEXT("hi"), TEXT("Message"), MB_OK);
         }
    }
}

我想使每个MessageBox都在屏幕上的其他位置 但是我不知道如何使用C ++更改位置

2 个答案:

答案 0 :(得分:2)

MessageBox()不允许您为其对话框窗口指定位置。

但是,您可以手动操作对话框窗口。首先,在调用MessageBox()之前,先通过SetWindowsHookEx()SetWinEventHook()安装线程本地挂钩。该钩子使您可以在创建对话框窗口时对其进行访问。然后,您可以使用对话框窗口执行任何操作,例如将其放置在您希望其出现的位置。

例如:

// Using SetWindowsHookEx() ...

__thread int MsgBox_X;
__thread int MsgBox_Y;

static LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HCBT_CREATEWND)
    {
        CBT_CREATEWND *s = (CBT_CREATEWND*) lParam;
        s->lpcs->x = MsgBox_X;
        s->lpcs->y = MsgBox_Y;
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int MessageBoxPos(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType, int X, int Y)
{
    HHOOK hHook = SetWindowsHookEx(WH_CBT, &CBTProc, NULL, GetCurrentThreadId());
    MsgBox_X = X;
    MsgBox_Y = Y;
    int result = MessageBox(hWnd, lpText, lpCaption, uType);
    if (hHook) UnhookWindowsHookEx(hHook);
    return result;
}

// Using SetWinEventHook() ...

__thread int MsgBox_X;
__thread int MsgBox_Y;

static void CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
    SetWindowPos(hwnd, NULL, MsgBox_X, MsgBox_Y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}

int MessageBoxPos(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType, int X, int Y)
{
    HWINEVENTHOOK hHook = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_CREATE, NULL, &WinEventProc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT);
    MsgBox_X = X;
    MsgBox_Y = Y;
    int result = MessageBox(hWnd, lpText, lpCaption, uType);
    if (hHook)  UnhookWinEvent(hHook);
    return result;
}

无论哪种方式,您都可以根据需要呼叫MessageBoxPos()

void _MessageBox()
{
    ResultMB = MessageBoxPos(NULL, TEXT("MB!"), TEXT("Message"), MB_OK, DesiredX, DesiredY);
    if (ResultMB == IDOK)
    {
        for (int q = 1; q < 5; q++)
        {
            ResultMB = MessageBoxPos(NULL, TEXT("hi"), TEXT("Message"), MB_OK, DesiredX, DesiredY);
        }
    }
}

答案 1 :(得分:0)

我认为我们无法更改MessageBox的位置。没有原型请求位置的int值,MessageBox的返回值是int值,这是您按下的按钮的ID。

所以这不可能。

但是我可以提出一些建议。

创建一个新窗口,并为其指定一个句柄,例如HWND。

然后使用SetWindowPos函数更改Windows位置:

SetWindowPos(hwnd,NULL,PositionX,PositionY,SizeX,SizeY,SWP_SHOWWINDOW);

,对于The Beep,您可以使用MessageBeep()函数。它适用于MessageBox的ICON主题:

MessageBeep(MB_OK);

MessageBeep(MB_ICONINFORMATION);

或者也是

MessageBeep(MB_ICONERROR);

就是这样,谢谢您的阅读!