首页
社区
课程
招聘
[求助]类似QQ的CTRL+ALT+Z激活是如何实现的
发表于: 2009-4-3 11:02 6225

[求助]类似QQ的CTRL+ALT+Z激活是如何实现的

2009-4-3 11:02
6225
收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
找到这么个说明,不是很明确。。

其实现过程非常简单,只需先向操作系统添加一个全局原子(Atom),然后再向操作系统登记一个热键,当程序在后台运行期间一旦有此热键按下,操作系统将会抛出系统消息WM_HOTKEY,所以服务程序只需在 WM_HOTKEY消息响应函数中添加相应代码即可实现服务程序的后台激活。
2009-4-3 11:06
0
雪    币: 139
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=;]...[/QUOTE]
寒,不知道 上面那个资料你是怎么查的

API:RegisterHotKey
2009-4-3 12:08
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
谢啦,api知道了。现在有一个地方不是很懂

先GlobalAddAtom
然后RegisterHotKey

结束时候
GlobalDeleteAtom
UnRegisterHotKey

消息处理部分没搞懂。。
C++builder里面应该怎么弄呢

看到个delphi例子

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = HotKeyId[0] then ShowMessage('F2');
end;

这个按F2事件发生后,会有一个消息WM_HOTKEY
但这个消息怎么触发到这个WMHotKey函数的呢。。我没看到哪里把函数指针作为callback之类注册到哪里呀。。
2009-4-3 13:41
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
看MSDN说
The WM_HOTKEY message is posted when the user presses a hot key registered by the RegisterHotKey function. The message is placed at the top of the message queue associated with the thread that registered the hot key.
2009-4-3 13:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个是不是比较复杂的说
看来我们还都是初学者啊,很初的初学者
2009-4-3 14:20
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
查了些资料,照葫芦画瓢写了下,但还是不起作用呀。。

    void __fastcall OnHotKey(TMessage Message);
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_HOTKEY, TMessage, OnHotKey)
    END_MESSAGE_MAP(TForm)

这个应该就是定义WM_HOTKEY如何handle了。
但我怎么从来进不去OnHotKey事件呢??
2009-4-3 14:28
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
又做了个实验,加了一个窗口大小resize的handler

MESSAGE_HANDLER(WM_SIZE, TWMSize, OnWMSize);

这个事件可以被截获到到。

那就说明程序结构没问题。

怎么回事儿呢。
2009-4-3 15:05
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
貌似现在问题转化成C++builder如何获得程序自身的句柄了。。

谁知道?
2009-4-3 15:20
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
hohohoho

原来就是 this->Handle
2009-4-3 15:51
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
搞定

就是在FormCreate时候

    HWND hWnd = this->Handle;
    if(GlobalFindAtom("MyHotKey") != 0)
    {
        hotkeyid=GlobalAddAtom("MyHotKey");

        if( RegisterHotKey(hWnd,hotkeyid,MOD_ALT,VK_F2) == 0 )
        {
            printError("RegisterHotKey");
        }
    }   

在FormDestroy时候

    UnregisterHotKey(NULL,hotkeyid);
    GlobalDeleteAtom(hotkeyid);

做一个OhHotKey事件

void __fastcall TForm1::OnHotKey(TMessage Message)
{
MessageBox(NULL,"ok","ff",0);
//你自己想做的事儿
}

最后用如下的宏来完成相当于注册 OnHotKey 的处理

    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_HOTKEY, TMessage, OnHotKey)
    END_MESSAGE_MAP(TForm)
2009-4-3 16:08
0
游客
登录 | 注册 方可回帖
返回
//