如何使用c语言的sc_close禁用messageboxa win32函数中的关闭按钮?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用c语言的sc_close禁用messageboxa win32函数中的关闭按钮?相关的知识,希望对你有一定的参考价值。

我已经有一段时间了,因为我的消息框中有一个取消按钮。而且我不希望关闭按钮产生干扰,因为我的取消按钮可以执行任何操作。如果我按下按钮,那是不应该发生的。我使用了一些循环查找技巧,但是当我使用它时,我打开了一个与消息框标题相同的文件夹。它还禁用了资源管理器的按钮,这很烦人这就是我用来禁用也会干扰具有相同标题的其他窗口的按钮的原因

DWORD WINAPI CreateMessageBox(void *argr)
    *(int*)argr = MessageBoxA( NULL, 
        "Time is past active hours\nPlease save your work\nSystem is shutting down in 1 minute.\n", 
        "Warning", 
        MB_OKCANCEL|MB_ICONSTOP|MB_SYSTEMMODAL );

    return 0;

                thread = CreateThread(NULL, 0, CreateMessageBox, &opt, 0, NULL);
                while (!(msg = FindWindow(NULL, "Warning")));
                style = GetWindowLongPtr(msg, GWL_STYLE);
                SetWindowLongPtr(msg, GWL_STYLE, style & ~WS_SYSMENU);
                WaitForSingleObject(thread, INFINITE);

但是现在我在某处读到,有一个sc_close东西也禁用了该窗口的关闭按钮?如何使用?我已经看过一些有关它的文章,但是他们都不使用消息框,这让我不知所措。请有人帮我

答案

您对FindWindow()的调用未指定类名,因此它将找到具有匹配标题的any顶级窗口。您的情况是一个“浏览器”窗口。提供MessageBox窗口的实际类名,即"#32770"

msg = FindWindow("#32770", "Warning")

但是,一种更可靠的方法是完全摆脱CreateThread()FindWindow(),而是使用SetWindowsHookEx(WH_CBT)捕获HWND创建的MessageBox(),然后可以根据需要进行操作:] >

LRESULT CALLBACK MyCBTProc(int nCode, WPARAM wParam, LPARAM lParam)

    if (nCode == HCBT_CREATEWND)
    
        ((CBT_CREATEWND*)lParam)->lpcs->style & ~WS_SYSMENU;
    

    /* alternatively:
    if (nCode == HCBT_ACTIVATE)
    
        HWND hwnd = (HWND)wParam;
        LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE);
        SetWindowLongPtr(hwnd, GWL_STYLE, style & ~WS_SYSMENU);
    
    */

    return 0;


...

HHOOK hHook = SetWindowsHookEx(WH_CBT, &MyCBTProc, NULL, GetCurrentThreadId());

opt = MessageBoxA(NULL,
    "Time is past active hours\nPlease save your work\nSystem is shutting down in 1 minute.\n",
    "Warning",
    MB_OKCANCEL|MB_ICONSTOP|MB_SYSTEMMODAL);

if (hHook)
    UnhookWindowsHookEx(hHook);

或者,只需使用TaskDialog()TaskDialog()代替TaskDialogIndirect()。除非您在启用TaskDialogIndirect()标志的情况下调用MessageBox(),否则Task Dialog在标题栏中没有关闭按钮:

表明即使使用TaskDialogIndirect()TaskDialogIndirect()成员均未指定取消按钮,也应能够使用Alt-F4,Escape和和标题栏的关闭按钮]关闭对话框。

TDF_ALLOW_DIALOG_CANCELLATION

以上是关于如何使用c语言的sc_close禁用messageboxa win32函数中的关闭按钮?的主要内容,如果未能解决你的问题,请参考以下文章

MFC禁用关闭按钮

fedora23没有/var/log/messages &如何禁用后台自动更新软件?

Angularjs - 如何获得 ng-message required 错误以同时显示和禁用输入按钮

如何在 Visual Studio 2015 中禁用 C# 6 支持?

java代码转c语言

on_message 事件禁用所有机器人命令