VBScript中的SendKey是个很有用的方法,可以用代码实现一些简单的自动化操作。实际上,通过SendMessage发送WMKEYDOWN和WMKEYUP消息就可以实现同样的功能。而且这个办法可以向任意窗口发送消息,目标窗口并不需要具有焦点。
从MSDN可以查到,WM_KEYDOWN和WM_KEYUP消息除了virtual-key code之外,还需要一个scan code。文档只说这个值根据不同的键盘会有所不同,但如何获得这个值却没有提。
好吧,这篇东西值得看的其实也就这一点点了,那就是:MapVirtualKey
以下程序是我用No$gba玩《恶魔城·苍月的十字架》时写来刷25号怪的,该作的魂系统实在太变态,不想点办法我会有一种被游戏玩了的感觉。还别说,有一种当年玩MUD的感觉。
require "Win32API"
module Win32
module_function
WM_KEYDOWN = 0x100
WM_KEYUP = 0x101
VK_SHIFT = 0x10
VK_NUMPAD4 = 0x64
VK_A = 0x41
VK_D = 0x44
VK_W = 0x57
def sendMessage(hWnd, nMsg, wParam, lParam)
f = Win32API.new('user32', 'SendMessage', 'LILL', 'L')
f.call(hWnd, nMsg, wParam, lParam)
end
def findWindow(sClass, sTitle)
f = Win32API.new('user32', 'FindWindow', 'PP', 'L')
f.call(sClass, sTitle)
end
def mapVirtualKey(uCode, uMapType)
f = Win32API.new('user32', 'MapVirtualKey', 'II', 'I')
f.call(uCode, uMapType)
end
def sendKey(hWnd, aKeys)
aKeys.each do |key_code|
sendMessage(hWnd, WM_KEYDOWN, key_code, 1 + (mapVirtualKey(key_code, 0) << 16))
sleep(0.1)
end
aKeys.reverse.each do |key_code|
sendMessage(hWnd, WM_KEYUP, key_code, 0xc000_0001 + (mapVirtualKey(key_code, 0) << 16))
sleep(0.1)
end
end
end
s = 'No$gba Emulator '
h = Win32.findWindow(nil, s)
while true
4.times do |n|
Win32.sendKey(h, [Win32::VK_SHIFT])
sleep(0.5)
end
Win32.sendKey(h, [Win32::VK_A])
sleep(0.1)
3.times do |n|
Win32.sendKey(h, [Win32::VK_SHIFT])
sleep(0.5)
end
Win32.sendKey(h, [Win32::VK_D])
sleep(0.1)
Win32.sendKey(h, [Win32::VK_D])
sleep(0.1)
5.times do |n|
Win32.sendKey(h, [Win32::VK_W, Win32::VK_NUMPAD4])
sleep(0.5)
end
end
没有评论 :
发表评论