如何在控制台应用程序中注册WndProc

6
当我创建一个新的Win32应用程序时,我注意到以下函数:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

当某个地方调用函数PostMessage或SendMessage时,您将收到消息,并且我注意到函数WndProc可以接收消息,因为有一个注册它的函数。
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SCREENCAPTURE));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_SCREENCAPTURE);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

注意: wcex.lpfnWndProc = WndProc;

我想了解PostMessage()的机制以及如何接收它,因此我创建了一个C++控制台应用程序,以查看是否可以注册函数WndProc,以下是我的尝试代码:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int a = 1;//Break point here to see if it's call
    return 0;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.lpfnWndProc = WndProc;
    wcex.hInstance = hInstance;


    return RegisterClassEx(&wcex);
}

void main()
{
    MyRegisterClass(GetModuleHandle(NULL));//(HINSTANCE)GetConsoleWindow()

    PostMessage(GetConsoleWindow(), 132, 0, 0);

    SYSTEMTIME st;

    while (true)
    {
        GetSystemTime(&st);
        printf("I'm wanting and waiting and waiting :(, The time is %I64u \n", st.wMilliseconds);
    }

}

1
看起来你忘记问问题了。 - πάντα ῥεῖ
1
哦,问题是:如何在控制台应用程序中注册WndProc,就像标题一样。 - 123iamking
请使用Windows或其他特定平台的标签来标记这些类型的问题。 :-) 我真的不想看到它们。 呕吐! :-) - Omnifarious
1个回答

5
一个窗口过程如果没有与窗口关联,就无法接收消息。你所做的只是创建了一个窗口类。你仍然需要创建该类的一个窗口,以便你的窗口过程(WndProc)可以接收消息。
根据你想让窗口过程接收的消息类型,你可以创建一个不在屏幕上显示的隐藏窗口。如果你需要处理某些消息,如键盘和鼠标事件,这些事件是针对控制台窗口的,那么你可以使用SetConsoleModeReadConsoleInput来获取这些事件。还有SetConsoleCtrlHandler,它允许你处理WM_QUERYENDSESSION事件。

微软在MSDN上提供了一个示例,展示如何使用ReadConsoleInput处理某些控制台输入事件。


哦,我喜欢发送和接收我定义的消息,并且希望它简单易懂,方便查看。 - 123iamking
3
控制台窗口是由Windows自身定义类的窗口。它有它自己的窗口过程,而且正是这个函数,而不是你自己的函数,会处理你发送到控制台窗口的消息。 - Ross Ridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接