目前可以模拟输入A-Z等按键
但是该怎样模拟输入VK_LEFT等虚拟键呢?还有就是,如果DirectX窗口转到后台,GetPixel取不到颜色值,为什么?

解决方案 »

  1.   

    http://www.codeproject.com/cs/media/directxcapture.asp
      

  2.   

    我的发送模拟键盘代码是:
    PostMessage(Target_hWnd,WM_KEYDOWN,cVirtualKeyCode,MapVirtualKey(cVirtualKeyCode,0)<<16);
    可以发送普通按键,比如cVirtualKeyCode = 'a'~'z'/'1'~'0'等
    但是发送cVirtualKeyCode = VK_LEFT等就一点反应都没有
      

  3.   

    Pretranslatemessage 这个可以的,
    BOOL CDialog1::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message==WM_KEYDOWN )
    {
    if(判断是VK_LEFT) }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    用keybd_event试试,不过不能用于后台窗口
      

  5.   

    可能已经解决了
    谢谢大家
    KF_EXTENDED
      

  6.   

    加上KF_EXTENDED在DirectX也还是不正常
    做过测试程序,检查真正的系统发出的按键消息
    各参数都正确啊
    wParam和lParam和加上KF_EXTENDED发出的消息一样
    不知道为什么了
      

  7.   

    http://www.m5home.com/bbs/dispbbs.asp?boardID=2&ID=1283&page=1
      

  8.   

    遇到同样的问题,我是要发送ALT键失败,顶一下
      

  9.   

    .驱动级模拟    如果上面的方法你都试过了,可是你发现目标程序却仍然顽固的不接受你模拟的消息,寒~~~~~~~~~还好,我还剩下最后一招,这就是驱动级模拟:直接读写键盘的硬件端口!
        有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键盘端口的方法来模拟硬件事件了。要用这个方法来模拟键盘,需要先了解一下键盘编程的相关知识。
        在DOS时代,当用户按下或者放开一个键时,就会产生一个键盘中断(如果键盘中断是允许的),这样程序会跳转到BIOS中的键盘中断处理程序去执行。打开windows的设备管理器,可以查看到键盘控制器由两个端口控制。其中&H60是数据端口,可以读出键盘数据,而&H64是控制端口,用来发出控制信号。也就是,从&H60号端口可以读此键盘的按键信息,当从这个端口读取一个字节,该字节的低7位就是按键的扫描码,而高1位则表示是按下键还是释放键。当按下键时,最高位为0,称为通码,当释放键时,最高位为1,称为断码。既然从这个端口读数据可以获得按键信息,那么向这个端口写入数据就可以模拟按键了!用过QbASIC4.5的朋友可能知道,QB中有个OUT命令可以向指定端口写入数据,而INP函数可以读取指定端口的数据。那我们先看看如果用QB该怎么写代码:
    假如你想模拟按下一个键,这个键的扫描码为&H50,那就这样
    OUT &H64,&HD2   '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
    OUT &H60,&H50   '把扫描码&H50发送到&H60端口,表示模拟按下扫描码为&H50的这个键
    那么要释放这个键呢?像这样,发送该键的断码:
    OUT &H64,&HD2   '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
    OUT &H60,(&H50 OR &H80)   '把扫描码&H50与数据&H80进行或运算,可以把它的高位置1,得到断码,表示释放这个键直接用游客账号就可以看了还可以下载那个驱动DLLeveryone 123456