2013-12-19 181 views
1

我一直在试着尝试学习WINAPI,但是我创建的窗口立即关闭。正如你看到的那样,当按下W键或按下左键时,它将关闭程序,但是在没有按键被按下的情况下运行它仍会关闭。WinAPI窗口立即关闭

#include <windows.h> 
#include <windowsx.h> 


// the WindowProc function prototype 
LRESULT CALLBACK WindowProc(HWND hWnd, 
    UINT message, 
    WPARAM wParam, 
    LPARAM lParam); 

// the entry point for any Windows program 
int WINAPI WinMain(HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, 
    int nCmdShow) 
{ 
    // the handle for the window, filled by a function 
    HWND hWnd; 
    // this struct holds information for the window class 
    WNDCLASSEX wc; 

    // clear out the window class for use 
    ZeroMemory(&wc, sizeof(WNDCLASSEX)); 

    // fill in the struct with the needed information 
    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = WindowProc; 
    wc.hInstance = hInstance; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW; 
    wc.lpszClassName = L"WindowClass1"; 

    // register the window class 
    RegisterClassEx(&wc); 

    // create the window and use the result as the handle 
    hWnd = CreateWindowEx(NULL, 
     L"WindowClass1", // name of the window class 
     L"Game", // title of the window 
     WS_OVERLAPPEDWINDOW, // window style 
     1, // x-position of the window 
     1, // y-position of the window 
     1800, // width of the window 
     1000, // height of the window 
     NULL, // we have no parent window, NULL 
     NULL, // we aren't using menus, NULL 
     hInstance, // application handle 
     NULL); // used with multiple windows, NULL 

    // display the window on the screen 
    ShowWindow(hWnd, nCmdShow); 

    // enter the main loop: 

    // this struct holds Windows event messages 
    MSG msg; 

    // wait for the next message in the queue, store the result in 'msg' 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     // translate keystroke messages into the right format 
     TranslateMessage(&msg); 

     // send the message to the WindowProc function 
     DispatchMessage(&msg); 
    } 

    // return this part of the WM_QUIT message to Windows 
    return msg.wParam; 
} 

// this is the main message handler for the program 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    // sort through and find what code to run for the message given 
    switch (message) 
    { 
     // this message is read when the window is closed 

    case WM_MOUSEMOVE: 
    { 

     // Retrieve mouse screen position 
     int x = (short)LOWORD(lParam); 
     int y = (short)HIWORD(lParam); 

     // Check to see if the left button is held down: 
     bool leftButtonDown = wParam & MK_LBUTTON; 

     // Check if right button down: 
     bool rightButtonDown = wParam & MK_RBUTTON; 

     if (leftButtonDown == true) 
     { 
      //left click 
      //example lets close the program when press w 
      PostQuitMessage(0); 
      return 0; 
     } 


    } 

    case WM_KEYDOWN: 
    {       
     switch (wParam) 
     { 
     case 'W': 

      //w pressed 
      //example lets close the program when press w 
      PostQuitMessage(0); 
      return 0; 
     } 
    } 

    case WM_DESTROY: 
    { 
     // close the application entirely 
     PostQuitMessage(0); 
     return 0; 
    } 
    default: 
     break; 
    } 

    // Handle any messages the switch statement didn't 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 
+0

注意,一些评论是不正确的。 – Mackenzie

+0

风格评论:写'if(condition)',而不是'if(condition == true)'。 – Roddy

+0

尝试删除此:'返回DefWindowProc(hWnd,消息,wParam,lParam);'它有什么区别? – kvr

回答

3

您的switch声明中没有break

你最终exetuting

PostQuitMessage(0); 

你可以做这样的事情:

case WM_FOO: 
{ 
    if (bar) { 
     return 0; 
    } 
    break; 
} 
5

你错过了在你的交换机一些break报表,因此,例如,如果你得到了WM_MOUSEMOVE消息和leftButtonDown != true,执行将落入WM_KEYDOWN等。

最终你到case WM_DESTROY:,它会Post你一个可爱的QuitMessage。另外,通过在调试器中逐句执行声明,可以很容易地发现这种情况。

+0

我把休息,但它仍然立即关闭。 – Mackenzie

+0

@MackenzieGoodwin然后更新问题中的代码。 – manuell

+0

@icabod这是我很好,我重新安装了我的垫板的驱动程序。感谢所有人的帮助! – Mackenzie

0

请勿通过WM_MOUSEMOVE消息检测点击,而应使用WM_MOUSEDOWN

问题是您的代码可能是由您点击某个东西启动的,因此当您的窗口获得第一个WM_MOUSEMOVE消息时,该按钮仍然会被按下。代码运行比手指快..