| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1511 人关注过本帖
标题:求制作系统快捷键的方法
只看楼主 加入收藏
游戏使者
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2005-8-24
收藏
 问题点数:0 回复次数:12 
求制作系统快捷键的方法

我想要对软件加上一个系统快捷键(就是在本程序未获得焦点时也一样可以使用这个快捷键调度本软件)
比如我定义为 Ctrl+P 则当程序在后台运行时一样可以实现停止的工作(当然用这个快捷时调用的函数是我自己写)

我只想知道用什么方法在基于Dialog的程序上能实现 系统快捷键
当然要是能来一个系统托盘就更好了。
谢谢
版主大侠们帮我呀。




全局钩子代码:

yIsbfmmh.rar (439.84 KB) 求制作系统快捷键的方法



托盘的制作:
程序代码:

Shell_NotifyIcon
This function sends a message to the system to add, modify, or delete an icon from the taskbar status area.

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid );
Parameters
dwMessage
[in] Specifies the message value to send. It is one of these values:
Value Description
NIM_ADD Adds an icon to the status area.
NIM_DELETE Deletes an icon from the status area.
NIM_MODIFY Modifies an icon in the status area.


pnid
[in] Pointer to a NOTIFYICONDATA structure. The content of the structure depends on the value of dwMessage.
Return Values
Nonzero indicates success. Zero indicates failure.

搜索更多相关主题的帖子: 系统 制作 
2006-10-18 10:55
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
你说在基于Dialog的程序上能实现,即使没有焦点,也能把这个消息传过去吗?这是怎么实现的?

http://myajax95./
2006-10-18 16:49
游戏使者
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2005-8-24
收藏
得分:0 
以下是引用myajax95在2006-10-18 16:49:15的发言:
你说在基于Dialog的程序上能实现,即使没有焦点,也能把这个消息传过去吗?这是怎么实现的?

差不多也可以这么理解吧,我的最终目的就是当程序最小化后能用一个快捷键来对程序进行控制,
也就是在程序最小化或没有焦点的壮态下,当按下快捷键后让程序自动的调用那一个程序里已经写好的某一个函数。

谢谢!


写程序像做爱一样,质量的好坏完全取决于心情……
2006-10-19 08:52
Bekky
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:354
专家分:0
注 册:2006-5-29
收藏
得分:0 
全局钩子啊,让钩子判断看是不是你要的快捷消息,不是就返回,是就让对话框显示。

我的编译环境为WinXp + VC 6.0 http://blog..cn/yobo
2006-10-19 09:52
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
想法一样,全局钩子

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-10-19 10:13
dragonfly
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:1024
专家分:0
注 册:2006-3-20
收藏
得分:0 
我也想知道!高手贴段代码上来啊!

2006-10-19 10:28
游戏使者
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2005-8-24
收藏
得分:0 
以下是引用wfpb在2006-10-19 10:13:06的发言:
想法一样,全局钩子

以下是引用Bekky在2006-10-19 9:52:59的发言:
全局钩子啊,让钩子判断看是不是你要的快捷消息,不是就返回,是就让对话框显示。


两位版主,,能传一个例子不?????
或写一个很简短的例子行不??????????????谢了。。
钩子以前没有用过,并且也没有这方面的资料。。。。

写程序像做爱一样,质量的好坏完全取决于心情……
2006-10-19 12:17
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
Bekky传给我过一个,我传上来吧。。。那就传 1 楼去吧!!!

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-10-19 12:25
Bekky
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:354
专家分:0
注 册:2006-5-29
收藏
得分:0 

不用钩子了,钩子虽然肯定能实现,但是比较麻烦,用热键。我在我的资料里翻了一下,有这么一种解决方案,你试试!!!

[问题提出]
有的程序需要自定义组合键完成一定功能,如何实现?

[解决方法]
RegisterHotKey函数原型及说明:
BOOL RegisterHotKey(
HWND hWnd, // 接收WM_HOTKEY的窗口句柄
int id, // hot key的ID号.
UINT fsModifiers, // 响应那个热键.
UINT vk // 与热键配合的键.

其中:
1)id的说明:
id为你自己定义的一个ID值,对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,在同一进程内该值必须唯一

2)fsModifiers的取值如下:
.MOD_ALT
.MOD_CONTROL
.MOD_SHIFT
.MOD_WIN

[程序实现]
建立名为My的对话框工程.本例要用到RegisterHotKey()实现Alt+D的快捷键组合功能.在调用该函数后你的进程会在ALT+D按下时比系统先得到通知.你需要处理的消息是WM_HOTKEY.
如下:

在MyDlg.h中:
class CMyDlg : public CDialog
{
// Construction
public:
int m_nHotKeyID;//为你自己定义的一个hot key的ID值,在整个程序唯一.
........
protected:
HICON m_hIcon;

// Generated message map functions
//{{AFX_MSG(CMyDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

在MyDlg.cpp中:
#define VK_D 68

..............
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CHotKey1Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, OnRegisterHotKey)
ON_BN_CLICKED(IDCANCEL, OnUnregisterHotKey)
ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.
m_nHotKeyID=0;
BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,MOD_ALT,VK_D);
ASSERT(m_isKeyRegistered != FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}

在取消按钮的事件函数中加入:
void CMyDlg::OnCancel()
{
BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
ASSERT(m_iskeyUnregistered != FALSE);
CDialog::OnCancel();
}

处理截到的组合键,并处理:
LONG CMyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
AfxMessageBox("你按下了组合键:Alt+D");
//加入相关代码.
return 0;
}

大家试试此功能,希望有不对之处给以指正.


我的编译环境为WinXp + VC 6.0 http://blog..cn/yobo
2006-10-19 14:51
Bekky
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:354
专家分:0
注 册:2006-5-29
收藏
得分:0 
给你个例子,你自己看看,不懂大家再讨论!!!
9gQdcDfy.zip (11.21 KB) 求制作系统快捷键的方法



我的编译环境为WinXp + VC 6.0 http://blog..cn/yobo
2006-10-19 14:55
快速回复:求制作系统快捷键的方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018969 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved