《设定系统热键关闭当前窗》由会员分享,可在线阅读,更多相关《设定系统热键关闭当前窗(4页珍藏版)》请在金锄头文库上搜索。
1、设定系统热键关闭当前窗口 WINDOWS 中有一系统热键 Alt+F4 用来关闭当前窗口,笔者最近出于兴趣,用 VC+ 6 编 写了一个程序用来实现此热键功能.实现思想如下: - 1.创建一个不在任务栏显示图标的窗口. - 2.在程序中注册一个系统热键,并在通知栏为程序创建一个图标. - 3.禁止多个程序同时运行. - 4.通过枚举窗口函数关闭当前窗口. - 一、创建一个不在任务栏显示图标的窗口 -利用 AppWizard 生成一个最简单的 SDI 窗口,不要状态条、工具条、 ActiveX 支持、 3D 控件、打印和打印预览。 - 打开资源编辑器,插入一个空对话框,ID 号为 IDD-DIA
2、,并在主框类中 添写代码。 BOOL CMainFrame:PreCreateWindow(CREATESTRUCT/m_bCreate 是 CmainFrame 类中的一个 protected 型 BOOL 变量,初始值为 false。 if( !m_bCreate ) /dlg 是 CmainFrame 类中的 一个 public 型 CDialog 变量。 m_bCreate=dlg.Create( IDD_DIA ); if(m_bCreate ) dlg.ShowWindow( SW_HIDE ); ; if(m_bCreate) cs.hwndParent=dlg.GetSafeH
3、wnd(); cs.cx=330; cs.cy=100; return TRUE;- 二、在程序中注册一个系统热键并在通知栏为程序创建一个图标 - 在视类 OnOnInitialUpdate 函数中添加代码如下: void CKillView:OnInitialUpdate() CView:OnInitialUpdate();/ TODO: Add your specialized code here and/or call the base class /id 和 nid 是 CkillView 类的成员变量, id 类型为 ATOM 型,nid 类型为 NOTIFYICONDATAid=:
4、GlobalAddAtom( “#123“ ); /SHIFT+ALT+Z 为热键,尽量使用比较生疏的键. if(!:RegisterHotKey ( m_hWnd,id,MOD_SHIFT| MOD_ALT,Z ) ) MessageBox( “hot key register failed!“ );HICON hIcon=AfxGetApp()-LoadIcon( IDI_ICON1 ); nid.hIcon=hIcon; nid.hWnd=m_hWnd; nid.cbSize=sizeof( NOTIFYICONDATA ); / WM_MYMESSAGE 在文件头中定义: #defin
5、e WM_MYMESSAGE WM_USER+10 nid.uCallbackMessage=WM_MYMESSAGE; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; nid.uID=IDR_MENU1; sprintf(nid.szTip,“系统监视器“ ); Shell_NotifyIcon(NIM_ADD, 在视类重载 WM_DESTORY 消息函数 void CKillView:OnDestroy() CView:OnDestroy();/ TODO: Add your message handler code here Shell_NotifyIc
6、on( NIM_DELETE ,:GlobalDeleteAtom( id ); :GlobalDeleteAtom( :GlobalFindAtom( “unique_zxd“ ) );- 三、禁止多个程序同时运行. - 在应用程序类中添加代码: BOOL CKillApp:InitInstance() if(:GlobalFindAtom( “unique_zxd“ )=0) :GlobalAddAtom( “unique_zxd“ ); else AfxMessageBox( “已有实例运行!“ ); return false; . - 四、通过枚举窗口函数关闭当前窗口 - 为响应热键消
7、息,在消息映射入口添加代码: BEGIN_MESSAGE_MAP( CKillView, CView ) /AFX_MSG_MAP( CKillView ). ON_MESSAGE( WM_HOTKEY,OnHotkey ) /AFX_MSG_MAP END_MESSAGE_MAP() 在视类添加成员函数: afx_msg void OnHotkey ( WPARAM wParam,LPARAM lParam ); 在函数体中添加代码: void CKillView:OnHotkey ( WPARAM wParam,LPARAM lParam ) /sign 是 CKillView 类中的一个
8、 protected 型 int 变量,初始值为 0。 sign=0; :EnumWindows( ( WNDENUMPROC )EnumWindowP,0 ); - 关于 EnumWindows()函数在各类杂志中均有介绍,此处不多作介绍.要详知 看 msdn. EnumWindowP()函数为一全局函数,代码如下: BOOL CALLBACK EnumWindowP ( HWND hWnd,LPARAM lParam ) CWnd *pWnd=CWnd: FromHandle( hWnd ); if( pWnd-IsWindowVisible() ) CString str; pWnd-GetWindowText(str); if(!str.IsEmpty() if( sign=1 ) pWndSendMessage( WM_SYSCOMMAND,SC_CLOSE, MAKELPARAM( 123,123 ) ); return true; 此外还需为通知栏图标响应消息,添加菜单并响应菜单函数,因不是本文主题,在 此不作介绍. 以上程序在 win97,win98,win2000 中均获通过.