关于HotKey的设置(顺便自己写了一个小程序)

 昨天看电脑报的时候看到了编程版那里讲了一个关于老板键的设置,可以随意的切换窗口,这可与Alt+Tab 不一样哦,这个可以把窗口弄消失的,连任务栏上也没有的。不过他写的那个我觉得没什么用啊,所以我就像自己写一个,主要那时想给朋友做的,上班的时候玩游戏的话可以很快的切,不怕老板看到。嘻嘻,不过最后没成功,因为游戏好像不让我怎么做,在编码方面加密了,哎~~~~我反正想了很久,没想出来,上网一查查出来全是外挂的资料,我可不想做外挂,所以在请求了高手朋友之后就不想做这个功能了。不过还是基本完成了它的切换功能。


  下面我来讲一下关于在写程序过程的一些步骤:

 我是用VC来写这个程序的,大概有许多朋友对VC没什么好感,觉得它里面的代码写的很不好看,不过你想想MFC是什么时候写的啊,我们要原谅它的。谢谢,用VC来开发程序还是很方便的,这次有关于界面的设计所以就直接想用VC写了,不然用Window直接编,那可有难度的啊,就像侯老师说

所说的,我可不会嫌机器的馒头不要吃。




  1.我的程序的功能要完成的功能有下面这些:

     第一:能观察鼠标所在的窗口的标题和窗口类名(不一定非要是在最上面的窗口)。

     第二:可以显示和隐藏你所指定的窗口。

     第三:可以通过快捷键来控制你所要的窗口。


 下面我来讲讲我的思路和我的程序:

界面是如下这样:


我不会插入图片,哎~~~所以我就只能上传的。


界面上比较简单,有3个EDIT,5个Button 具体的话一看就明白了。


先关于对怎么样获得鼠标所在的窗口的:


在这里我用了下面的几个函数:

GetCursorPos(&p1)


而p1 就是一个CPoint类,反正不懂的话可以查MSDN哦;

这个函数我们可以找到鼠标现在的坐标的。


然后在通过函数hwnd=WindowFromPoint(p1),

这样我们就可以取得鼠标所在的窗口的句柄。然后通过SendMessage(hwnd,WM_GETTEXT,256,(LPARAM)(void*)ch),我们就可以让它把窗口的标题放入在ch中,这里的ch是(char ch[256]),至于为什么这个消息可以这样呢,MSDN上是这么说的:发送这个消息可以用来复制这个窗口的标题(翻译的不怎么样,不能理解的话去查一下)。


我们知道了窗口的标题就可以把他显示出来,让用户看看。


通过GetClassName(hwnd,class1,256),这个函数把窗口类名复制到class1中去,这样我们就完成我们第一步干的。


现在我们要干一件很重要是事情就是鼠标的扫描。为了能让那窗口能不断的显示鼠标当前位置的,所以我们在这里要设置一个定时器,我把这个函数放在对话框创建的CBosskey::OnInitDialog()函数中,

UINT SetTimer( UINT nIDEvent , UINT nElapse , void (CALLBACK EXPORT* lpfnTimer )(HWND, UINT, UINT, DWORD) );

我就使用了这个函数,我来解释一下这个函数的参数:

nIDEvent :这个参数是用来标记这个定时器的,比如在后面你要用KillTimer(UINT nIDEvent ) ,这时候就要使用到这个标记了。

nElapse  :  这个是你设置的时间间隔,以毫秒为单位。

第三个看似很复杂其实我们没必要使用它,这个用来指示处理这个消息的函数,不过如果你设置为空的话,那就会让OnTimer 函数出来,我们也不用那么麻烦去设置这个函数。

 

 

void CBosskeyDlg::OnTimer(UINT nIDEvent)
{
    char head[256];                 //
用来存储窗口标题名字
    char class1[256];               //
存储类名
    CPoint p1;
    ::GetCursorPos(&p1);            //
获取鼠标的坐标
    
    m_hwnd=::WindowFromPoint(p1);

    ::SendMessage(m_hwnd,WM_GETTEXT,256,(LPARAM)(void*)head);

    GetDlgItem(IDC_EDIT_HEAD)->SetWindowText(head);

    ::GetClassName(m_hwnd,class1,256);
    GetDlgItem(IDC_EDIT_CLASS)->SetWindowText(class1);
    CString strhead(head);
    CString strmyhead(m_head1);
    if(strhead.Find(strmyhead)>=0 && strhead.Find(strmyhead)<=strhead.GetLength()-strmyhead.GetLength())
    {
        KillTimer(1);
    }
   
    CDialog::OnTimer(nIDEvent);
}

 

基本的OnTimer 的函数应该是这样,中间有那个KillTimer 的使用,是用来当你找你要的窗口标题的时候你就停止定时器,不然一直变,那就乱七八糟了。

 

 

现在我们讲一下关于HotKey 的设置

 

MFC 中,微软的工程师们已封装了许多许多的消息,但不是所有的Window 消息都是被封装好的,而现在我们的WM_HOTKEY 就是这种没有封装的消息,要自己手动的加入。

 

至于要怎么手动加入呢??我建议不懂的朋友去看看深入浅出MFC 的第三章,讲得很好很强大。

 

在这个过程中我们先要注册我们自己的热键。使用到两个函数

ATOM GlobalAddAtom(lpstring)

这个函数的重点在于返回值,

GlobalAddAtom returns a string atom whose value is in the range 0xC000 through 0xFFFF.

 

If the lpString parameter has the form "#1234", GlobalAddAtom returns an integer atom whose value is the 16-bit representation of the decimal number specified in the string (0x04D2, in this example). If the decimal value specified is 0x0000 or a value in the range 0xC000 through 0xFFFF, the return value is zero, indicating an error. If lpString is in the range 0x0001 through 0xBFFF, the return value is the low-order word of lpString .

 

不过这段文字我理解起来很郁闷,红色的地方我的问题就很大。英语不好很不爽啊~~~~

 

然后就是使用注册函数。RegisterHotKeyGetSafeHwnd(),hotkey,MOD_SHIFT,'D';

GetSafeHwnd() 是用来返回当前窗口的句柄的,后面的3 个分别是:标示符(GlobalAddAtom 产生的),功能键,键;

 

不过这两个函数一定要在离开程序之前把他们释放掉,不然这个快捷键会存有痕迹使用两个函数

UnregisterHotKeyGlobalDeleteAtom 就可以了。

 

讲手动作消息吧!

 

还是不会插入图片,所以就一次上传了。

这个手动加消息有2步

1.就是在你要用来处理这个热键的消息的窗口的头文件中在那一堆的afx_msg 中加入

这样一个函数

afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);

然后去它的cpp文件中,

找到一个以BENGIN_MESSAGE_MAP(CBossDlg,CDialog)开始和以END_MESSAGE_MAP结束的一段代码

然后在里面加入ON_MESSAGE(WM_HOTKEY,OnHotKey)

最后你就只要去定义这个OnHotKey函数就可以了。

 

关于这里的消息映射,我现在也在学的~~~不过学了就觉得不那么深奥了啊~~~~~~~~~~~

 

忘了说一件事,这个是我不怎么明白的事情,知道的朋友能告诉我一下:

就是我把注册热键的函数放在了对话框的构造函数中了,可是它注册成功却在程序中无效~~后来放到了它的OnitDialog中去就可以,只是找了一个替代的方法。



我的程序下载地址:

http://www.rayfile.com/files/3371b023-ca86-11de-bcab-0014221b798a/  


你可能感兴趣的:(String,存储,Class,mfc,callback,button)