使用keybd_event模拟键盘输入

#include <windows.h>
BOOL CALLBACK GetChild(HWND hWnd,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    HWND hWnd=::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('V',0,0,0);//按下c
        ::keybd_event('V',0,2,0);//放开C
        ::keybd_event(VK_CONTROL,0,2,0);//放开ctrl
        return 0;
    }
    return true;
}
程序的功能是在记事本程序中模拟按下ctrl+c,来粘贴剪贴板中的内容,程序首先将记事本窗口置顶,然后按下复制按键。
逆向了一下keybd_event函数,发现他其实是调用的user32.dll中的SendInput函数,而SendInput函数直接调用系统内核,到达系统内核以后OD便无法继续跟踪了。所以,是否keybd_event函数模拟按键足够底层了呢?如果他不能模拟就只能求助于驱动级的模拟了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值