2016-12-24 8 views
3

Когда я создаю новое приложение Win32, я замечаю функцию:Как зарегистрировать WndProc в консольном приложении

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;

Я хочу UNDE ру и понять механизм 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

Похоже, вы забыли задать вопрос. –

+0

О, вопрос в том, как зарегистрировать WndProc в консольном приложении, точно так же, как и название. – 123iamking

+0

Пожалуйста, отметьте эти вопросы с помощью окон или какой-либо другой конкретной платформы. :-) Я действительно хочу не видеть их. * bleah! * :-) – Omnifarious

ответ

3

процедура окно не может получить если он не связан с окном. Все, что вы сделали, создано класс окна. Вам все равно нужно создать окно этого класса для вашей оконной процедуры (WndProc) для получения сообщений.

В зависимости от типа сообщения, которое вы хотите получить в своей процедуре Windows, вы можете создать скрытое окно, которое не отображается на экране. Если вам нужно обрабатывать определенные сообщения, такие как события клавиатуры и мыши, которые направлены в окно консоли, вместо этого вы можете использовать SetConsoleMode и ReadConsoleInput для получения этих событий. Также есть SetConsoleCtrlHandler, который позволяет обрабатывать события WM_QUERYENDSESSION.

Microsoft имеет пример в MSDN, который shows how to use ReadConsoleInput обрабатывает определенные события ввода в консоль.

+0

О, мне нравится отправлять и получать мои определенные сообщения, и я хочу, чтобы это было просто, чтобы я мог его легко увидеть. – 123iamking

+2

@ 123iamking Окно консоли - это окно с классом, которое определяется самой Windows. У него есть собственная оконная процедура, и именно эта функция, а не ваша, будет обработана сообщением, которое вы отправили в окно консоли. –

+0

@ Росс-Ридж: большое спасибо :) – 123iamking

Смежные вопросы