WM_NCDESTROY
を手作業で送信した後、私は変なウィンドウペインティングをします。これは、ビジュアルスタイルがオンの場合にのみ発生します。 'クラシックスタイル'がオンの場合、ウィンドウには影響しないようです。手動で送信するとWM_NCDESTROY
をDefWindowProc()
に渡すことはありませんが、ウィンドウがまだ奇妙に描画されています。 SendMessage()
はWM_NCDESTROY
のようです。 WM_NCDESTROY
はDefWindowProc()
に渡されても処理されないのはなぜですか?WM_NCDESTROYを送信した後、ウィンドウが奇妙に(ビジュアルスタイルなしで)描かれているのはなぜですか?
右Test2をクリックした後にTest2を右クリックする前に
#include <windows.h>
HINSTANCE g_hInst;
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static BOOL bProcessMsg = FALSE;
switch(msg)
{
case WM_RBUTTONUP:
SendMessage(hwnd, WM_NCDESTROY, 0, 0);
//Size window manually after this message is processed to see the effects
break;
case WM_DESTROY:
bProcessMsg = TRUE;
break;
case WM_NCDESTROY:
if(!bProcessMsg) return 0;
MessageBox(0, L"Message processed", 0, MB_OK);
return DefWindowProc(hwnd, msg, wParam, lParam);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK WndProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_MBUTTONUP:
{
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hInstance = g_hInst;
wc.lpfnWndProc = WndProc2;
wc.lpszClassName = L"Testclass2";
if(!RegisterClassEx(&wc)) return 0;
CreateWindowEx(0, L"Testclass2", L"Test2", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 40, 40, 200, 200, hwnd, 0, g_hInst, 0);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc = { 0 };
HWND hwnd;
MSG msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc1;
wc.lpszClassName = L"Testclass";
if(!RegisterClassEx(&wc)) return 0;
g_hInst = hInstance;
hwnd = CreateWindowEx(0, L"Testclass", L"Test1", WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, 0, 0, hInstance, 0);
if(!hwnd) return 0;
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, 0, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
うーん、なぜあなたは 'WM_NCDESTROY'を自分で送りますか? –
テスト目的です。 'SendMessage()'はそれ自体を処理しているので、どのプロセスもあなたにこのメッセージを送ることができ、それを防ぐ方法がないようです。 – Mike32ab
これは意味をなさないものです。他のプロセスがあなたのプロセス内のウィンドウに 'WM_NCDESTROY'メッセージを送ることを決定した場合、それもそうです。あなたを守ることは何もありません。正常な場合(つまり、不正なアプリケーションが実行されておらず、他のプログラムをスローしているシステム)で動作するようにアプリケーションを実装するだけです。 – IInspectable