首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改C++中的MessageBox位置

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

Stack Overflow用户
提问于 2019-03-14 04:24:59
回答 2查看 1.2K关注 0票数 1
代码语言:javascript
运行
复制
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 ++更改位置

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-14 04:57:17

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

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

例如:

代码语言:javascript
运行
复制
// 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;
}

代码语言:javascript
运行
复制
// 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()

代码语言:javascript
运行
复制
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);
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-03-14 04:33:17

我不认为我们可以改变MessageBox的位置。没有为位置请求int值的原型,MessageBox的返回值是一个int值,这是您所按下的按钮的ID。

所以这是不可能的。

但我可以提个建议。

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

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

代码语言:javascript
运行
复制
SetWindowPos(hwnd,NULL,PositionX,PositionY,SizeX,SizeY,SWP_SHOWWINDOW);

对于蜂鸣声,您可以使用MessageBeep()函数。它适用于MessageBox的图标主题:

代码语言:javascript
运行
复制
MessageBeep(MB_OK);

或者

代码语言:javascript
运行
复制
MessageBeep(MB_ICONINFORMATION);

或者也可以

代码语言:javascript
运行
复制
MessageBeep(MB_ICONERROR);

好了,谢谢你的阅读!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55150622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档