WM_KEYDOWN в CDialog ?

5 отговора 156 прегледа
#1

WM_KEYDOWN в CDialog ?

Как да го хвана, ако имам бутон върху dlg?
Имам ли нещо в CView като SetActiveWindow което да ми помогне?
Благодаря ви ! ! !

Отговор
в отговор на LamerSlamer #2

Re: WM_KEYDOWN в CDialog ?

imashe SetFocus ili nesto ot sorta taka bi triabvalo da stane

Отговор
в отговор на LamerSlamer #3

Re: WM_KEYDOWN в CDialog ?

Кое от двете искаш да хванеш? WM_KEYDOWN в диалога или WM_KEYDOWN бутона?

Отговор
в отговор на Xypodilec #4

Re: WM_KEYDOWN в CDialog ?

Абе то и в бутона ще ми свърши работа ама аз искам в диалога.
Не ми се вярва да е толкоз трудно.
Имам основен изглед - CDialog.( генериран с Wizarda )
На него има два бутона IDOK и IDCANCEL, който да пукна ако знам за какво ги слагат.
Махам ги. И ловя съобщенията на ON_KEYDOWN с VK_DOWN, VK_RIGHT.
Седя, клеча ама не кълве.

Don't hesitate to educate yourself ! ! !
Отговор
в отговор на LamerSlamer #5

HHOOK SetWindowsHookEx()


Certain Windows messages are difficult to trap in a dialog box because they are either processed by the Windows internal dialog procedure or sent to the control instead of the dialog box. There are several ways to do this, but they usually involve subclassing all the controls in the dialog box or using a Windows hook function.


Тъй като едва ли ще хукнеш да subclass-ваш all the controls in the dialog box, остава HOOK варианта.

В .cpp файла, където ти е APP-класа:

HHOOK hHook;

LRESULT CALLBACK MessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MSG FAR *pMsg;

if ( nCode >= 0 )
{
if ( nCode == MSGF_DIALOGBOX )
{
pMsg = (MSG FAR *)lParam;

if ( pMsg->message == WM_KEYDOWN )
{
CString s;
s.Format("WM_KEYDOWN %x", pMsg->wParam);
::SetWindowText(pMsg->hwnd, (LPCTSTR)s);
return 0L;
}
}
}

return CallNextHookEx(hHook, nCode, wParam, lParam);
}

//////


В InitInstance(), преди извикване на dlg.DoModal():
...

if ( !(hHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, NULL, m_nThreadID)) )
{
...правиш квото искаш с GetLastError()...
}

...

След dlg.DoModal():
...

UnhookWindowsHookEx(hHook);

...

Та така. И най-добре погледни това онова за HHOOK SetWindowsHookEx(WH_MSGFILTER, ...) и LRESULT CALLBACK MessageProc()

Отговор
в отговор на LamerSlamer #6

Re: WM_KEYDOWN в CDialog ?

sto ne probas s PreTranslateMessage
vav dialoga

Отговор