C#中如何锁住鼠标

Posted on 2008-01-22 15:14  Samson小天  阅读(4353)  评论(0编辑  收藏  举报

     前几天写了一篇关于U盘锁的文章,写完之后上瘾了,竟然打算自己写一个这样的软件。
     唉~这个软件第一次分析的时候简单,但是对我这种“高级”程序员,还是有点难度的。还好在看了一点《Programming Windows》(这本书可不是讲核心编程的,是WIN32编程而已,可惜好书总是绝版的早)后理清了思路。
     程序基本上难点就在锁定鼠标这块。网上的大牛要么HOOK住鼠标键盘,拦截掉所有发往自己程序之外的键盘鼠标消息;还有就是重写了系统的GINA.DLL,屏蔽Ctrl,alt,delete,Esc等键盘操作,用ClipCursor函数锁定鼠标。
     我不是什么大牛,去CodeProject上下载了个Hook的类也用不来,-_-||。经过自己的琢磨分析,终于想到了一个简单的方法(还多亏了《Programming Windows》给我勇气用这个方法的)。
     其实就是用一个Timer控件,每隔几秒就检查一次当前活动窗体的句柄(GetForegroundWindow函数),如果和自己的窗体句柄不同,那么用SendMessage API函数发送最小化命令(本来想发关闭命令的,但是这样会丢失未保存的数据,实在不太好),然后用SetForegroundWindow API函数将自身设定为主要窗体并用ClipCursor函数锁定鼠标。
注:这里为什么说《Programming Windows》给我勇气呢,因为一开始我担心timer在一秒内执行不了这么许多代码,后来看到WINDOWS消息机制中TIMER是入队消息,所以后一个timer在检查的时候在前一个timer完成后,也就是说我的if语句绝对不会出错的说。

     大家可能会想,为什么要那么复杂么,我用了ClipCursor后鼠标不是一直在里面了么。其实……只要按下win或者Ctrl+Esc键,或者锁定下计算机(win+l)然后重新登录ClipCursor就挂了。所以必须劳师动众的调用其他几个函数协作。
    这里给大家一部分源码:

//如何让鼠标只在一定范围内移动
        导入DLL
        IntPtr Global_ActiveWindowIntPtr;
        
private void timer_DelayLock_Tick(object sender, EventArgs e)
        
{
            
const uint WM_SYSCOMMAND = 0x0112;
            
const int SC_MINIMIZE = 0xF020;
            Global_ActiveWindowIntPtr 
= GetForegroundWindow();
            
if (this.Handle!=Global_ActiveWindowIntPtr&&Global_ActiveWindowIntPtr!=IntPtr.Zero)
            
{
                SendMessage(Global_ActiveWindowIntPtr, WM_SYSCOMMAND, SC_MINIMIZE, 
0);//发送最小化消息
                Form_Main.EncrtptionClassMain.LockIt(this.Handle.ToInt32());
                SetForegroundWindow(
this.Handle);//把自己激活为活动窗体
            }

        }

    另外只要把SC_MINIMIZE改成其他消息,如SC_CLOSED就能把当前活动窗体关闭。具体SC_CLOSED的值是多少可以去WIN32下看,貌似是存在某个头文件里的,include了windows.h应该就能用右击转到定义看了。本想整理出来给大家看的,不过最近比较忙,等有空找找看,我对MSDN不太熟啊,不然应该是举手之劳的说。如果牛人知道也可以告诉我下哈~

Copyright © 2024 Samson小天
Powered by .NET 8.0 on Kubernetes