现在的位置: 首页 > 综合 > 正文

VC实现对话框置顶并获取键盘输入焦点

2018年03月16日 ⁄ 综合 ⁄ 共 918字 ⁄ 字号 评论关闭

今天遇到一个问题,另一个程序通过socket向另一个程序发送消息以将另一个程序显示在最前面,并且可以直接接受键盘消息(这里为什么直接接受,就是不用鼠标去点击,键盘事件焦点直接就这这个窗口上)。本来方法是有好几种,比如说SetActiveWindow(),SetForground等等方法,但是今天遇到的这个问题是,调用这两个方法均不能成功!

下面一个可以实现:

void CBillValidatorDlg::SetActive(HWND m_hWnd)
{
 DWORD dwForeID;  
 DWORD dwCurID;  
 HWND hForeWnd = ::GetForegroundWindow();  
 dwCurID = ::GetCurrentThreadId();  
 dwForeID = ::GetWindowThreadProcessId( hForeWnd, NULL );  
 ::AttachThreadInput( dwCurID, dwForeID, TRUE); //获取输入焦点
 ::SetWindowPos( m_hWnd, HWND_TOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE ); //设置Z-Order
 ::SetWindowPos( m_hWnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE ); //还原Z-Order
 ::SetForegroundWindow( m_hWnd );  
::AttachThreadInput( dwCurID, dwForeID, FALSE);
}

编程经验小结

1、在编写程序一定要注意些注释,有经验的程序都知道这一点的重要性。

2、在书写函数时,注意检测输入参数的合法性,在调用函数时注意检测函数的返回值来判断函数调用是否成功。

3、加深对系统框架重要性的认识,一个软件的系统框架没有设计好,系统的程序实现将会寸步难行以致到走不下去,重新设计框架,对于一个比较大的项目,应首先对系统实现过程中的技术难题通过demo程序的方式一一攻破,然后不要再继续写代码,应该花很大一部分时间来考虑系统的框架,当系统的框架搭建好了,系统实现就变得很简单了。

 

抱歉!评论已关闭.