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=
SendMessage(h, WM_KEYDOWN, VK_F12, 1+MapVirtualKey(VK_F12, 0) shl 16);
首先你确定是否label1.Caption已变为'已找到窗体',如果已变了,说明已找到Handle;
然后试下这句:PostMessage(h,WM_CHAR,VK_F12,0);
不好意思,我直接修改以前的程序,注释没改过来。“//如果找到密码输入窗体”这是以前的老注释,应该是“如果找到VBA窗体”
caption已变成“已找到窗体”,可你提供的代码也不能用。
我用sendmessage关闭vba窗体是可以的,就是发送按键过不去,很费解。
caption已变成“已找到窗体”,可你提供的代码也不能用。
我用sendmessage关闭vba窗体是可以的,就是发送按键过不去,很费解。再不行就试下: PostMessage(h,WM_IME_KEYDOWN,VK_F12,0);
如果有兴趣,麻烦您下载1楼中的模拟器和ROM,亲自调试一下。非常感谢!
push 0a0 // 常量
push 0f0 // 常量
push eax
mov edi, 416a60 // 截图函数地址
call edi
add esp,0c // 恢复栈平衡自己定义个pchar变量,把保存路径写进去,然后把字串地址传给eax
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;
可惜我对delphi调用asm不熟悉,能否将代码传给我一份学习学习,再谢!
[email protected]
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了解,上面代码已经全部写出来了,就那么几行。你照抄调用就行了
我水平太菜,不知道该如何操作才能让VBA接受这段代码,麻烦您再费费口舌或者将完整的工程代码发给我。
另外,经过实验,12楼朋友提供的sndkey32.pas也是可行的,由于个人疏忽,曾经认为无效,在此一并谢过!