How to handle WM_KEYDOWN in a Dialog???

Hello,
I have a problem.

I'm writing a standard application
on Visual C++, using Win32 and
the ATL classes included in
the headers ATLBase.h and ATLWin.h.
I use my own classes derived from:

CMyWindow : public CWindowImpl<CMyWindow>

CMyDialog : public CDialogImpl<CMyDialog>

I make my main window,
and then open a dialog at some time.

My question is:
How to handle for example the WM_KEYDOWN message in this
dialog.
I want when I press for example "Alt+A" and the focus
is in any of the controls in the dialog, this WM_KEYDOWN message to be handled from a single function
for example:
CMyDialog::OnKeyDown(.........),
not from this control's WM_KEYDOWN handler.

If this would help, I want to make the same as the Form KeyPreview property in Visual Basic does.
The WM_KEYDOWN should be handled somehow firstly by the dialog, and
then by the concreate control.

How could I do this???

Thank you in advance.

Pavel Tsekov, Varna, Bulgaria
LVL 1
paul_tsekovAsked:
Who is Participating?
 
jhanceConnect With a Mentor Commented:
A dialog window doesn't normally send your application WM_KEYDOWN messages.  So if you want to get them you must SUBCLASS the dialog and provide your own message handler.

See the SDK help for SubclassDlgItem() or SubclassWindow().
0
 
mblatCommented:
There is an article Q117563 in Microsoft Knowleage Base.
HOWTO: How to Trap WM_KEYDOWN Messages in a CDialog.

It shows the way for MFC based app.  I see that you are using WTL, but it may point you to the right direction.

Hope it helps.
0
 
Vinayak KumbarSr Program ManagerCommented:
Hi,

I am not sure about the architecture of ur app. If u r using MFC, then using classwizard, map the PreTranslateMessage(...) function to ur dialong class and modify it as

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
     if(pMsg->message == WM_KEYDOWN)
     {
          //Here U R when a key is hit, but, Alt is handled differently.
          //So u can get here by hitting any other key combinations. Like
          //if(pMsg->wParam == 'B')
          // Key B is hit
          //and
          //if(GetKeyState(VK_CONTROL) & 0x8000) && (pMsg->wParam == 'A'))
          // Key Ctrl+B is hit
     }

     //When Alt is hit check like this
     if((GetKeyState(VK_MENU) & 0x8000) && (pMsg->wParam == 'A'))
     {
          // U R Here as User hit Alt+A
          //Call Ur Function!!!!
          DoKeyProcess();
     }
     
     return CDialog::PreTranslateMessage(pMsg);
}

void CTestDlg::DoKeyProcess()
{
     AfxMessageBox("Alt+A Hit");
}

Here DoKeyProcess()is declared as void DoKeyProcess()in public section of dialog's .h file

Try it out.
VinExpert

0
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

 
MoondancerCommented:
Please finalize the following year 2001 question:
http://www.experts-exchange.com/jsp/qShow.jsp?ta=visualbasic&qid=20246850
Moondancer - EE Moderator
0
 
SrinivasaRaoCommented:
i think vinexpert is right:)
bsr
0
 
paul_tsekovAuthor Commented:
No, the EXPERT is not right.
I'm using the CDialogImpl<> class,
not CDialog.
I'm not talking about MFC here.
I talk about ATL!!!!!!!!!!!!!!!!
0
 
paul_tsekovAuthor Commented:
No, the EXPERT is not right.
I'm using the CDialogImpl<> class,
not CDialog.
I'm not talking about MFC here.
I talk about ATL!!!!!!!!!!!!!!!!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.