我想实现一个类似ALT+TAB切换程序窗口的功能,但不同的是我在我的程序里面注册几个系统热键,用来快捷切换,比如注册CTRL+ALT+F1是切换Matlab.exe,CTRL+ALT+F2切换出Winword.exe,CTRL+ALT+F3是切换出devenv.exe。。。
程序是这样写代码的:
Code Snippet
1、在OnInitDialog()注册热键 ::RegisterHotKey(m_hWnd,1,MOD_CONTROL|MOD_ALT,VK_F1);
在OnDestroy()取消注册 UnregisterHotKey(m_hWnd,1); 2、在OnHotKey事件处理中写处理代码如下 LRESULT CSimWorkBenchDlg::OnHotKey(WPARAM wParam,LPARAM lParam) 3、GetProcessEntryByProcessName函数根据程序的进程名,利用EnumWindows方法在系统进程中查找相应的窗口句柄,然后再用SetForegroundWindow方法将程序切换到最前面 GetProcessEntryByProcessName(TCHAR* processName,PROCESSENTRY32& pe32) { HANDLE hProcessSnap; // 获取系统进程快照 // 使用PROCESSENTRY32结构前先设置它的大小 // 在快照句柄中获取第一个进程 // 遍历快照进程,如果查找到指定进程则返回成功 } while( Process32Next( hProcessSnap, &pe32 ) ); CloseHandle( hProcessSnap ); }
4、EnumWindows的回调函数lpEnumFunc中,查找进程窗口句柄,如果查找成功则使用SetForegroundWindow切换至最前面 int CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam) /------------在这里我插入一段测试代码,获取当前窗口句柄的标题,在后面会具体说说作用---------/ ::GetWindowInfo(hwnd,&info); /--------------完毕------------------/
Code Snippet
整个程序按照上述方法实现,现在问题来了,就是::SetForegroundWindow(hwnd)这里,有的应用程序可以实现切换,比如matlab、vmware这些软件,而有的不可以,如devenv.exe(也就是VS.NET2005开发环境),有个现象值得注意,那就是matlab切换后这个软件的主窗口标题栏是激活状态(亮的),而vmware虽然切换成功了,但是主窗口标题栏不是激活状态(灰的),除了::SetForegroundWindow,我还试过其他很多种方法: 有::SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
我在代码中加入了一段测试代码,获取查找成功后的窗口句柄它的标题值,发现有的能获取到标题,matlab就可以,有的是没有标题(但实际上这款软件的程序窗口是有标题的),个人认为很可能是有的程序获取到的这个窗口句柄并不是主窗口句柄,但是用: :GetParent(hwnd)或者: :GetWindow(hwnd,GW_OWNER)之类的方法也获取不到有父窗口句柄。这个问题究竟是怎么回事?请高手们给我指导指导:) |
|