在Windows大行其道的今天windows界面程序受到广大用户的欢迎对这些程序的操作不外乎两种键盘输入控制和鼠标输入控制那么我们能否通过编制程序来控制系统的鼠标例如隐藏计算机中的鼠标呢?这个问题的答案是肯定的这里主要是通过一个Windows API函数来实现的下面以一个Visual C++的实例来介绍如何实现这个功能需要读者朋友们注意的是本代码具有一定的危险性程序运行后你将无法用鼠标控制您的计算机这时候需要对计算机的当前用户名进行注销或重新启动计算机
一实现方法
Windows提供了一个API函数mouse_event可以模拟一次鼠标事件比如左键单击双击和右键单击等在程序中使用此函数将产生一个十分有趣的效果所模拟的鼠标事件将屏蔽真正的鼠标事件我们的实例也就是利用该函数的这一特性来实现隐藏程序中的鼠标Mouse_event函数原型如下
VOID mouse_event(
DWORD dwFlags // flags specifying various motion/click variants
DWORD dx // horizontal mouse position or position change
DWORD dy // vertical mouse position or position change
DWORD dwData // amount of wheel movement
DWORD dwExtraInfo
// bits of applicationdefined information
);
第一个参数为代表所要模拟的鼠标消息为MOUSEEVENTF_LEFTDOWN时表示左键按下为MOUSEEVENTF_LEFTUP表示左键松开一般情况下dwFlags取值如下
MOUSEEVENTF_MOVE 移动鼠标
MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下
MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP 模拟鼠标右键抬起
MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下
MOUSEEVENTF_MIDDLEUP 模拟鼠标中键抬起
MOUSEEVENTF_ABSOLUTE 标示是否采用绝对坐标
第二三个参数分别表示鼠标的位置坐标xy根据MOUSEEVENTF_ABSOLUTE标志指定xy方向的绝对位置或相对位置第四五个参数并不重要一般也可设为
下面是关于mouse_event的示例代码用两个mouse_event (一次放下一次松开)实现了鼠标的单击模拟
POINT lpPoint;
GetCursorPos(&lpPoint);
SetCursorPos(lpPointx lpPointy);
mouse_event(MOUSEEVENTF_LEFTDOWN); mouse_event(MOUSEEVENTF_LEFTUP);
为了持续屏蔽系统的鼠标需要启动一个辅助线程来模拟鼠标的动作具体实现请参见代码部分
二编程步骤
启动Visual C++建立一个单文档的应用程序将程序命名为mouse
为了隐藏主窗口将程序中的CmainFrame类中的OnCreate()函数删除并在CWinApp类里调用m_pMainWnd>ShowWindow(SW_HIDE)
在CmainFrame类中定义全局变量POINT mpcursorNew
添加代码编译运行程序
三程序代码
/////////////////////////////////////线程函数
CMainFrame::CMainFrame()
{
HWND hWnd=::GetParent(NULL);
GetCursorPos(mp);
AfxBeginThread(FMousehWnd); //启动模拟鼠标行为的线程
}
UINT FMouse(LPVOID param)
{
WINDOWPLACEMENT wp;///窗口位置
wplength=sizeof(WINDOWPLACEMENT);
HWND hWnd;
char tmp[];
RECT rt;
int iResult;
iResult=AfxMessageBox(确实要隐藏吗?MB_OKCANCEL);
if(iResult==IDOK)
{
while()
{
hWnd=GetForegroundWindow();//得到系统中最前端窗口的句柄
GetWindowRect(hWndrt);
GetWindowText(hWndtmp);
GetWindowPlacement(hWndwp);//得到当前窗口的位置
GetCursorPos(&cursorNew);//得到当前鼠标的位置
while(){
::mouse_event(MOUSEEVENTF_MOVEcursorNewxcursorNewy);
//模拟鼠标的移动
}
}
}
return ;//结束线程
}
四小结
上述程序介绍了使用Windows的API函数mouse_event()来模拟鼠标的动作从而隐藏机器中的鼠标于之相对应Windows还提供了一个模拟键盘API函数Keybd_event()使用该函数可以相应的屏蔽键盘的动作Keybd_event()函数能触发一个按键事件也就是说回产生一个WM_KEYDOWN或WM_KEYUP消息该函数原型如下
VOID keybd_event(
BYTE bVk // virtualkey code
BYTE bScan // hardware scan code
DWORD dwFlags // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
从上述原型可以看出Keybd_event()共有四个参数第一个为按键的虚拟键值如回车键为vk_returntab键为vk_tab第二个参数为扫描码一般不用设置用代替就行第三个参数为选项标志如果为keydown则置即可如果为keyup则设成KEYEVENTF_KEYUP第四个参数一般也是置即可A的虚拟键值为所以可以用如下代码实现模拟按下A键
keybd_event();
keybd_event(KEYEVENTF_KEYUP);