如何激活一个window/dialog && 不能直接对Dialog Box使用SetFocus

时间:2023-01-08 06:29:43

问题,症状:

程序的主窗口CMainWnd创建了一个modal dialog,希望这个dialog能接收WM_KEYDOWN消息,但是需要点一下这个dialog窗口它才能接收到(我嫌麻烦),而且我发现,如果我保持CMainWnd处于激活状态,就没有这个问题。

所以就希望这个dialog一创建默认就能接收到WM_KEYDOWN,当然首先想到的是SetFocus,然后就看到了下面提到的没卵用(至少是对我这个问题)的那篇blog,无论是对dialog进行setfocus或者CMainWnd进行setfocus都没有用,也尝试了该blog提到的WM_NEXTDLGCTL,还是没用。

然后又搜到了几个解决办法,什么GotoDlgCtrl啊,PreTranslateMessage啊,统统无法解决这个问题,下面是我搜索过的资料:

http://computer-programming-forum.com/81-vc/73468bccb8affc17.htm

http://computer-programming-forum.com/82-mfc/ee69e2c176cdaf2c.htm

http://computer-programming-forum.com/82-mfc/f99bbc4314038236.htm

http://blog.163.com/lh_bbs/blog/static/1430708032011093159371/

搞得我实在没办法了,我就想到是不是应该有个ActivateWnd之类的,果然找到一个ActivateTopParent(如图,来自CWnd,奇怪的是这货居然在MSDN中搜不到文档!),然后我在OnInitDialog中的倒数第二句(也就是return之前)写上

this->ActivateTopParent()

问题解决!

如何激活一个window/dialog && 不能直接对Dialog Box使用SetFocus

后来我在OnInitDialog中试了试this->SetActiveWindow(),也没用,去调用CMainWnd的SetActiveWindow还是没有用

---------------------------没卵用---------------------------

原文:http://blogs.msdn.com/b/oldnewthing/archive/2004/08/02/205624.aspx

很棒的原创,我是说为什么在对dialog box使用SetFocus不管用呢

简单的说,解决办法就是

SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);

如果是MFC,就在dialog的member中调用

this->SendMessage(WM_NEXTDLGCTL, (WPARAM)this->GetSafeHwnd(), TRUE)

或者

this->GotoDlgCtrl(this)