procedure TForm1.Button1Click(Sender: TObject);
var H: HWND;
begin
  h := findwindow(nil, 'VisualBoyAdvance');
  if H > 0 then //如果找到密码输入窗体
  begin
    label1.Caption := '已找到窗体';
    SendMessage(h,WM_KEYDOWN,VK_F12,0);
  end;
end;
一段简单代码,向VBA模拟器发送模拟按键F12(功能是游戏截图),也试过postmessage,可总是无效,请各位帮帮忙。VBA模拟器链接:
http://disland.emu-zone.org/emu/vba.zip
超级马里奥游戏ROM链接
thunder://QUFmdHA6Ly9yb21zNjE4OnJvbXM2MThAcm9tczMuZW11NjE4LmNvbToyMzcvemhhbmdqaS9nYmEvYWxsc2V0LzIzNTggLSBDaGFvamkgTWFsaW91IFNoaWppZSAoQykuemlwWlo=

解决方案 »

  1.   

    findwindow(nil, 'VisualBoyAdvance');//VisualBoyAdvance是窗口的标题。而不是其它。
      

  2.   

    试试
    SendMessage(h, WM_KEYDOWN, VK_F12, 1+MapVirtualKey(VK_F12, 0) shl 16);
      

  3.   


    首先你确定是否label1.Caption已变为'已找到窗体',如果已变了,说明已找到Handle;
    然后试下这句:PostMessage(h,WM_CHAR,VK_F12,0);
      

  4.   


    不好意思,我直接修改以前的程序,注释没改过来。“//如果找到密码输入窗体”这是以前的老注释,应该是“如果找到VBA窗体”
      

  5.   


    caption已变成“已找到窗体”,可你提供的代码也不能用。
    我用sendmessage关闭vba窗体是可以的,就是发送按键过不去,很费解。
      

  6.   

    试下这个:PostMessage(h,WM_IME_CHAR,VK_F12,0);
      

  7.   


    caption已变成“已找到窗体”,可你提供的代码也不能用。
    我用sendmessage关闭vba窗体是可以的,就是发送按键过不去,很费解。再不行就试下: PostMessage(h,WM_IME_KEYDOWN,VK_F12,0);
      

  8.   

    感谢楼上的热心回复,但您提供的两条语句依然不能执行。
    如果有兴趣,麻烦您下载1楼中的模拟器和ROM,亲自调试一下。非常感谢!
      

  9.   

    可以下载个sndkey32.pas,调用AppActivate,然后SendKeys("{F12}")试试
      

  10.   

    如果这程序是用directinput处理按键,那自然是不接受任何按键消息
      

  11.   

    楼上说的有可能是对的,我试过向射手播放器发送没有任何问题。不知道direct input应该怎么处理才好,先查查资料吧
      

  12.   

    俺用od跟了下,找到了调用地址,你可以直接写远程代码或注入代码实现截图需要3个参数mov eax,保存路径字串地址 
    push 0a0  // 常量
    push 0f0  // 常量
    push eax 
    mov edi, 416a60 // 截图函数地址
    call edi
    add esp,0c // 恢复栈平衡自己定义个pchar变量,把保存路径写进去,然后把字串地址传给eax
      

  13.   

    用dll注入方式测试了下,截图成功,米有问题
    var
      path: PChar;
    begin
      path := 'c:\tmp.png'; //保存路径
      asm
        mov eax,path
        push $0a0  // 常量
        push $0f0  // 常量
        push eax
        mov edi, $416a60 // 截图函数地址
        call edi
        add esp, $0c // 恢复栈平衡
      end;
    end;
      

  14.   

    感谢楼上的朋友,您说的用OD跟踪F12功能代码的确是个很好的思路,我本来打算通过模拟向directinput发送按键消息实现。
    可惜我对delphi调用asm不熟悉,能否将代码传给我一份学习学习,再谢!
    [email protected]
      

  15.   


    var
      path: PChar;
    begin
      path := 'c:\tmp.png'; //保存路径
      asm
        mov eax,path
        push $0a0  // 常量,保存为图片尺寸的height
        push $0f0  // 常量,width
        push eax
        mov edi, $416a60 // 截图函数地址
        call edi
        add esp, $0c // 恢复栈平衡
      end;
    end;
    不需要对asm了解,上面代码已经全部写出来了,就那么几行。你照抄调用就行了
      

  16.   

    再次感谢楼上高手鼎力相助!
    我水平太菜,不知道该如何操作才能让VBA接受这段代码,麻烦您再费费口舌或者将完整的工程代码发给我。
      

  17.   

    感谢楼上的各位朋友,特别是soloie,给我提供了很好的思路和具体的方法,我会好好学习研究一下钩子函数。
    另外,经过实验,12楼朋友提供的sndkey32.pas也是可行的,由于个人疏忽,曾经认为无效,在此一并谢过!