WM_KEYDOWN в CDialog ?
5 отговора
156 прегледа
WM_KEYDOWN в CDialog ?
Как да го хвана, ако имам бутон върху dlg?
Имам ли нещо в CView като SetActiveWindow което да ми помогне?
Благодаря ви ! ! !
Имам ли нещо в CView като SetActiveWindow което да ми помогне?
Благодаря ви ! ! !
Re: WM_KEYDOWN в CDialog ?
imashe SetFocus ili nesto ot sorta taka bi triabvalo da stane
Re: WM_KEYDOWN в CDialog ?
Кое от двете искаш да хванеш? WM_KEYDOWN в диалога или WM_KEYDOWN бутона?
Re: WM_KEYDOWN в CDialog ?
Абе то и в бутона ще ми свърши работа ама аз искам в диалога.
Не ми се вярва да е толкоз трудно.
Имам основен изглед - CDialog.( генериран с Wizarda )
На него има два бутона IDOK и IDCANCEL, който да пукна ако знам за какво ги слагат.
Махам ги. И ловя съобщенията на ON_KEYDOWN с VK_DOWN, VK_RIGHT.
Седя, клеча ама не кълве.
Don't hesitate to educate yourself ! ! !
Не ми се вярва да е толкоз трудно.
Имам основен изглед - CDialog.( генериран с Wizarda )
На него има два бутона IDOK и IDCANCEL, който да пукна ако знам за какво ги слагат.
Махам ги. И ловя съобщенията на ON_KEYDOWN с VK_DOWN, VK_RIGHT.
Седя, клеча ама не кълве.
Don't hesitate to educate yourself ! ! !
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()