Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > ON_WM_KEYDOWN()


Автор: GLeBaTi 6.9.2008, 13:38
Есть код:
Код

BEGIN_MESSAGE_MAP(C_KBH_Dlg, CDialog)
...
ON_WM_KEYDOWN()
...
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////
//class C_KBH_Dlg:
...
public:
    afx_msg void OnKeyDown(UINT C,UINT R,UINT F);
...
/////////////////////////////////////////////////////////////
//реализация:
void C_KBH_Dlg::OnKeyDown(UINT C,UINT R,UINT F)
{
    MessageBox("Hello",0,MB_OK);
    UpdateData(0);    
}

тип проекта: MFC application->dialog based
Проблема: при нажатии любой клавиши во время выполнения программы, ничего не происходит((
Кто знает, что в моем коде не так ?

Автор: KEHT 6.9.2008, 17:52
Видимо какой-то элемент перебивает фокс с окна-рамки.

Автор: GLeBaTi 7.9.2008, 11:33
Нет, окно вроде активно smile 

Автор: KEHT 7.9.2008, 12:15
Я имею ввиду элемент именно в этом окне, например ActiveX 

Цитата

The framework calls this member function when a nonsystem key is pressed. A nonsystem key is a keyboard key that is pressed when the ALT key is not pressed or a keyboard key that is pressed when CWnd has the input focus. 


Автор: GLeBaTi 7.9.2008, 12:57
И как мне это исправить ?

Автор: KEHT 7.9.2008, 13:10
Ну, либо создать оконный подкласс для каждого элемента и переопределять в нем событие которое отвечает за ловлю клавиш, либо использовать keyboard hook

Автор: GLeBaTi 7.9.2008, 18:41
Что такое keyboard hook ??))

Автор: GLeBaTi 9.9.2008, 18:48
Тогда как с помощью ф-ии: 
Код

BOOL C_KBH_Dlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        MessageBox("Hello",0,MB_OK);
        UpdateData(0);   
    }
    return CDialog::PreTranslateMessage(pMsg);
}

как узнать какая клавиша была нажата?

Автор: KEHT 9.9.2008, 20:56
Код

BOOL C_KBH_Dlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        if(pMsg->wParam==VK_RETURN) //Смотря какая клавиша нужна
            MessageBox("Hello",0,MB_OK);
            UpdateData(0);   
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

Автор: GLeBaTi 10.9.2008, 07:58
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)