使用函数keybd_event可以模拟用户按键,源代码如下
程序的功能是在记事本程序中模拟按下ctrl+c,来粘贴剪贴板中的内容,程序首先将记事本窗口置顶,然后按下复制按键。Code
#include <windows.h>
BOOL CALLBACK GetChild(HWND hWnd,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hWnd&#61;::FindWindow("notepad",NULL);//获得记事本窗口句柄
if(hWnd)//如果获得成功
{
::ShowWindow(hWnd,SW_SHOW);//显示记事本窗口
if(::SetForegroundWindow(hWnd))//窗口置顶
{
::EnumChildWindows(hWnd,GetChild,0);//枚举记事本中的子窗口
}
return 0;
}
else
{
MessageBox(NULL,"no handle","error",MB_OK);
return 0;
}
}
BOOL CALLBACK GetChild(HWND hWnd,LPARAM lParam)//回调函数
{
char temp1[256];
::GetClassName(hWnd,temp1,255);//获得子窗口的类名
if(!::strcmp(temp1,"Edit"))//判断子窗口类名是否为edit
{
::keybd_event(VK_CONTROL,0,0,0);//按下ctrl
::keybd_event(&#39;V&#39;,0,0,0);//按下c
::keybd_event(&#39;V&#39;,0,2,0);//放开C
::keybd_event(VK_CONTROL,0,2,0);//放开ctrl
return 0;
}
return true;
}
#include <windows.h>
BOOL CALLBACK GetChild(HWND hWnd,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hWnd&#61;::FindWindow("notepad",NULL);//获得记事本窗口句柄
if(hWnd)//如果获得成功
{
::ShowWindow(hWnd,SW_SHOW);//显示记事本窗口
if(::SetForegroundWindow(hWnd))//窗口置顶
{
::EnumChildWindows(hWnd,GetChild,0);//枚举记事本中的子窗口
}
return 0;
}
else
{
MessageBox(NULL,"no handle","error",MB_OK);
return 0;
}
}
BOOL CALLBACK GetChild(HWND hWnd,LPARAM lParam)//回调函数
{
char temp1[256];
::GetClassName(hWnd,temp1,255);//获得子窗口的类名
if(!::strcmp(temp1,"Edit"))//判断子窗口类名是否为edit
{
::keybd_event(VK_CONTROL,0,0,0);//按下ctrl
::keybd_event(&#39;V&#39;,0,0,0);//按下c
::keybd_event(&#39;V&#39;,0,2,0);//放开C
::keybd_event(VK_CONTROL,0,2,0);//放开ctrl
return 0;
}
return true;
}
逆向了一下keybd_event函数&#xff0c;发现他其实是调用的user32.dll中的SendInput函数&#xff0c;而SendInput函数直接调用系统内核&#xff0c;到达系统内核以后OD便无法继续跟踪了。所以&#xff0c;是否keybd_event函数模拟按键足够底层了呢&#xff1f;如果他不能模拟就只能求助于驱动级的模拟了。