处理WM_KEYDOWN

时间:2013-04-14 18:48:36

标签: c++ winapi

如果按下shift键,我试图让我的程序切换bool。但是,由于某种原因,它似乎没有收到消息,因为我已经将MessageBoxes放在KEYDOWN和KEYUP情况下,并且它们不会被触发。这感觉就像是一个noob问题,但任何帮助都会受到赞赏。

BOOL CALLBACK CreateRoom(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
static char *achTileDetails = new char[100,100];
static POINT *pDimensions = new POINT, *pMonsterLocations = new POINT[10], *pMinDisplay = new POINT, *pMaxDisplay = new POINT;
static HBITMAP *pahbmTileset = new HBITMAP[4];
static bool *pbShowBars = new bool;
switch(Message)
{
case WM_INITDIALOG:
    g_hDialogInUse = hwnd;
    SetFocus(hwnd);
    for (int iii = 0; iii < 100; iii++)
        for(int jjj = 0; jjj < 100; jjj++)
            achTileDetails[iii,jjj] = 'g';
    (*pDimensions).x = 20;
    (*pDimensions).y = 10;
    (*pMinDisplay).x = 0;
    (*pMinDisplay).y = 0;
    (*pMaxDisplay).x = 20;
    (*pMaxDisplay).y = 10;
    for (int iii = 0; iii < 4; iii++)
        pahbmTileset[iii] = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_CLEAR_GROUND + iii));
    return TRUE;
case WM_PAINT:
    DisplayRoom(hwnd, achTileDetails, *pMaxDisplay, *pMinDisplay, pahbmTileset, *pbShowBars);
    break;
case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDCANCEL:
        delete[] achTileDetails;
        delete pDimensions;
        delete[] pMonsterLocations;
        delete pMinDisplay;
        delete pMaxDisplay;
        delete[] pahbmTileset;
        delete pbShowBars;
        EndDialog(hwnd, IDCANCEL);
        break;
    }
    break;
case WM_LBUTTONDOWN:

    break;
case WM_KEYDOWN:
    MessageBox(hwnd, "Down", "", NULL);
    switch (wParam)
    {
    case VK_SHIFT:
        *pbShowBars = true;
        InvalidateRect(hwnd, NULL, TRUE);
        UpdateWindow(hwnd);
        break;
    }
    break;
case WM_KEYUP:
    {
        MessageBox(hwnd, "Up", "", NULL);
        switch(wParam)
        {
        case VK_SHIFT:
            *pbShowBars = false;
            InvalidateRect(hwnd, NULL, TRUE);
            UpdateWindow(hwnd);
            break;
        }
    }
    break;
default:
    return FALSE;
}
}

消息循环:

 while(GetMessage(&Msg, NULL, 0, 0) != 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}

现在这是此回调的完整代码。我知道顶部的各种静态动态变量可能不是最有效的方法,但是可以用于我的目的。

1 个答案:

答案 0 :(得分:3)

WM_KEYUP / DOWN消息将发布到具有焦点的窗口。这不会是你的对话窗口,我们可以从WM_COMMAND消息处理程序告诉你至少有一个Cancel按钮。这很有可能成为焦点。除按空格键外,该按钮不会对消息做任何特殊处理。

使用对话框作为主窗口开始解决此问题。它不是一个适合实现游戏的窗口类型,它适用于对话框。在窗口只是作为容器的情况下,工作由您放在对话框上的控件完成。您可以通过拦截消息循环中的消息来抢救它,然后再将其分派到具有焦点的窗口。 TranslateAccelerator()函数是实现快捷键击的标准方法。或者通过在循环中调用IsDialogMessage并为WM_GETDLGCODE实现处理程序。