を使用SetWindowsHookEx()
してスレッド固有のWH_CBT
フックをインストールし、MessageBox の を取得してからHWND
、好きなように操作できます。例えば:
HHOOK hHook = NULL;
LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HCBT_CREATEWND)
{
HWND hMsgBox = (HWND) wParam;
LONG_PTR style = GetWindowLongPtr(hMsgBox, GWL_STYLE);
SetWindowLongPtr(hMsgBox, GWL_STYLE, style & ~WS_SYSMENU);
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
int WarnAboutPasswordChange(HWND hDlg)
{
hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTHookProc, NULL, GetCurrentThreadId());
int retun1 = MessageBox(hDlg, TEXT("Your password will expired, you must change the password"), TEXT("Logon Message"), MB_OK | MB_ICONINFORMATION);
if (hHook)
{
UnhookWindowsHookEx(hHook);
hHook = NULL;
}
return retun1;
}
Windows Vista 以降では、別の解決策があります -TaskDialogIndirect()
の代わりに使用しMessageBox()
ます。TDF_ALLOW_DIALOG_CANCELLATION
フィールドからフラグを省略TASKDIALOGCONFIG.dwFlags
すると、X ボタンと Escape キーが無効になります。
int WarnAboutPasswordChange(HWND hDlg)
{
TASKDIALOGCONFIG config = {0};
config.cbSize = sizeof(config);
config.hwndParent = hDlg;
config.dwCommonButtons = TDCBF_OK_BUTTON;
config.pszWindowTitle = L"Logon Message";
config.pszMainInstruction = L"Your password will expired, you must change the password";
config.pszMainIcon = TD_INFORMATION_ICON;
config.nDefaultButton = IDOK;
int retun1 = 0;
TaskDialogIndirect(&config, &retun1, NULL, NULL);
return retun1;
}