VC 中如何实现全局热键,不要求用组合键,如单键F2执行关机?

VC 中如何实现全局热键,不要求用组合键,如单键F2执行关机?,第1张

需要用到RegisterHotKey函数,注册热键。并增加对响应的消息处理功能。如果不需要组合键,RegisterHotKey的fsModifiers值可以选择MOD_KEYUP。 以下是前辈留下的资料,请参考:================================= BOOL RegisterHotKey(

HWND hWnd , //指定接收WM_HOTKEY消息的窗体句柄

int id, //热键标识,同一调用线程内的不同热键标识不能相同,应用程序中的标识值在0x0000和0xbfff之间,DLL中的在0xc000和0xffff之间

UINT fsModifiers,//下列值的组合:MOD_ALT,MOD_CONTROL,MOD_SHIFT,MOD_WIN,MOD_KEYUP

UINT vk //按键的虚拟码

)

//在初始化的时候注册:

RegisterHotKey(m_hWnd,1688,MOD_SHIFT|MOD_CONTROL,‘A‘)

RegisterHotKey(m_hWnd,2688,MOD_SHIFT|MOD_CONTROL,‘a‘)

//表示按下Shift+Ctrl+A和Shift+Ctrl+a

BOOL UnregisterHotKey(HWND hWnd, int id)

//添加WM_DESTROY消息时注销热键

{

CDialog::OnDestroy()

// TODO: Add your message handler code here

UnregisterHotKey(m_hWnd,1688)

UnregisterHotKey(m_hWnd,2688)

}

//添加消息函数

afx_msg LRESULT OnHotHey(WPARAM wParam,LPARAM lParam)

//实现

CWndsnapDlg::OnHotKey(WPARAM wParam,LPARAM lParam)

{

if(wParam==1688||wParam=2688)

{

CDialog a

a.DoModal()

}

if()

{

CDialog b

b.DoModal()

}

//...

}

有一组API专门用于实现热键 RegisterHotKey

if (RegisterHotKey(this->GetSafeHwnd(),0,MOD_CONTROL | MOD_ALT,VK_F1) &&

RegisterHotKey(this->GetSafeHwnd(),1,MOD_CONTROL | MOD_ALT,VK_F2))

{

MessageBox("注册热键成功!")

}

else

{

MessageBox("注册热键失败!")

}

销毁热键用

if (UnregisterHotKey(this->GetSafeHwnd(),0) &&

UnregisterHotKey(this->GetSafeHwnd(),1))

{

MessageBox("卸载热键成功!")

}

else

{

MessageBox("卸载热键失败!")

}

这种方法设置热键需要处理消息 WM_HOTKEY

ON_MESSAGE(WM_HOTKEY,OnHotKey)

消息处理函数

LRESULT CHotKeyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)

{

if (wParam == 0)

{

MessageBox("Ctrl + Alt + F1 被按下")

}

else

{

MessageBox("Ctrl + Alt + F2 被按下")

}

return 1

}

具体参数你可以通过MSDN或者网上查下。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11482697.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存