要作一个实时监测的程序,要求获知键盘任意键或鼠标移动或点击时,取消特定的动作。

解决方案 »

  1.   

    函数功能:该函数将256个虚拟键的状态拷贝到指定的缓冲区中。    函数原型:BOOL GetKeyboardState(PBYTE IpKeyState);    参数:    IpKeyState:指向一个256字节的数组,数组用于接收每个虚拟键的状态。    返回值:若函数调用成功,则返回0值。若函数调用不成功,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。    备注:应用程序可以调用该函数来检取所有虚拟键的当前状态。当键盘消息被从该线程的消息队列中移去时,虚拟键的状态发生改变。当键盘消息被发送到该线程的消息队列中,或者,当键盘消息被发送到其他线程的消息队列或被从其他线程的消息队列中检取到时,虚拟键的状态不发生改变。(例外:通过AttachThreadlnput连接的线程共享同一键盘状态。)当函数返回时,由lpKeyState参数指向的每一个数组成员中都包含了一个虚拟键的状态数据。若最高位被置为1,则该键处于down状态;否则,该键处于up状态。若最低位被置为1,则该键被触发。当一个键被打开时称之为被触发,如capslock键。若最低位被置为0,该键被关闭且不被触发。一个触发键也键盘上的指示灯(如果有的话)在该键被触发时点亮,在不被触发时灭掉。若要检取单个虚拟键的状态信息,可以调用GetKeyState函数。若要检取任一虚拟键的当前状态,而不管相应的键盘消息足否己从消息队列中检取到,可以使用GetAsyncKevState函数。应用程序可以使用虚拟键码常数VK_SHIFT,VK_CONTROL和VK_MENU作为IpKeyState所指向的数组的下标。这样给出的Shift,Ctrl,Alt键的状态不区分左右键。应用程序也可以使用如下的虚拟键码常数作为以上键的区分左右键的下标:    VK_LSHIFT,VK_RSHIFT,VK_LCONTROL,VK_RCONTROL;VW_LMENU,VW_RMENU仅当应用程序调用GetKeyboardState;SetKeyboardState,GetAsycKeystate,GetKeyState和MapVirtualKey函数时,才可用这些区分左右键的常数。    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;库文件: USer32.lib。
      

  2.   

    函数功能:该函数综合鼠标击键和鼠标动作。    函数原型:VOID mouse_event(DWORD dwFlags,DWORD dx,DWORD dwFlags,OWORD dx,DWORD dy, DWORD dwData, DWORD dwExtralnfo);    参数:    dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合:    MOOSE_EVENTF_ABSOLOTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。    MOOSEEVENTFMOVE:表明发生移动。    M00SEEVENTF_LEFTDOWN:表明接按下鼠标左键。    M00SEEVENTF_LEFTUP:表明松开鼠标左键。    MOOSEEVENTF_RIGHTDOWN:表明按下鼠标右键。    MOOSEEVENTF_RIGHTUP:表明松开鼠标右键。    MOOSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。    MOOSEEVENTF_MIDDLEUP:表明松开鼠标中键。    MOOSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。移动的数量由dwData给出。    dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLOTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。    dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLVTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。    dwData:如果dwFlags为MOOSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。    如果dwFlagsS不是MOOSEEVENTF_WHEEL,则dWData应为零。    dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessgeExtrajnfo来获得此附加信息。    返回值:无。    备注:如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。    如果指定了MOWSEEVENTF_ABSOLOTE值,则dX和dy含有标准化的绝对坐标,其值在0到65535之间。事件程序将此坐标映射到显示表面。坐标(0,0)映射到显示表面的左上角,(6553,65535)映射到右下角。    如果没指定MOWSEEVENTF_ABSOLOTE,dX和dy表示相对于上次鼠标事件产生的位置(即上次报告的位置)的移动。正值表示鼠标向右(或下)移动;负值表示鼠标向左(或上)移动。    鼠标的相对移动服从鼠标速度和加速度等级的设置,一个最终用户用鼠标控制面板应用程序来设置这些值,应用程序用函数SystemParameterslnfo来取得和设置这些值。    在应用加速时系统对指定相对鼠标移动提供了两个测试。如果指定的沿X轴y轴的距离比第一个鼠标阈值大,并且鼠标的加速等级非零,则操作系统将距离加倍。如果指定的沿X轴或y轴的距离比第二个鼠标阈值大,并且鼠标的加速等级为2,则操作系统将从第一个阈测试得来的距离加倍。这样就允许操作系统将指定鼠标沿X轴或y轴的相对位移加到4倍。    一旦应用了加速,系统用期望的鼠标速度换算合成的值。鼠标速度的范围是从1(最慢)到20(最快),并代表基于鼠标移动的距离指示符移动的数量。缺省值是10,表示对鼠标的移动设有附加的修改。    函数mouse_event需要用的应用程序用来合成鼠标事件。也被应用程序用来取得鼠标位置和鼠标按键状态之外的鼠标信息。例如,如果输入板制造商想将基于画笔的信息传给自己的应用程序,可以写一个直接与输入板硬件通信的动态键接库(DLL),获得附加的信息,并保存到一个队列中。DLL然后调用mouse_event,用标准按键和x/y位置数据,并在参数dwExtralnfo设置排列的附加信息的指针或索引。当应用程序需要附加信息时,调用DLL(连同存贮在dwEXtralnfo中的指针或索引),则DLL返回附加信息。    Windows CE:Windows CE不支持参数 dwFlags取MOOSE EVENTF WHEEL常数。    速查: Windows NT: 3.1及以上版本; Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;输入库:user32.lib。
      

  3.   

    Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Randomize Timer
    Command1.Move Abs(Width * Rnd - Command1.Width * 5 / 4), Abs(Height * Rnd - Command1.Height * 3 / 2)
    End Sub
      

  4.   

    Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
      

  5.   

    各位,可能我的问题提的不够明白,我再说一遍!
    如果程序中没有模拟鼠标移动的代码,是可以很方便的获知当前鼠标是否有物理上的移动的,只要判断鼠标光标的位置是否一样就可以了。
    但是现在的问题是,原本程序的代码中就有模拟鼠标移动,那么上述方法就不能获知鼠标是否被移动了。
    另外,监测键盘和鼠标是否按下的问题我已经解决了,就是使用GetAsyncKeyState函数来判断的,谢谢各位了!
      

  6.   

    to  boywang(大力水手) :
    你所提的方法是行不通的,由于程序中有让鼠标指针模拟移动的代码,所以对比指针位置并不能确定鼠标是否有物理移动啊!
      

  7.   

    to waterytimes(似水流年):
        我也有想过,你讲的理论上也确实可行——不过我没有试过!
        而且我想知道API中有没有可实现捕获鼠标物理移动的函数或者有其它的方法?!
      

  8.   

    to yefanqiu(叶帆):
    你所讲的“鼠标钩子”俺完全不懂,能不能给个例子呢?!谢谢!
      

  9.   

    http://expert.csdn.net/Expert/topic/1921/1921416.xml?temp=.5555231
    看我给的例子