Keybd_Event为什么在游戏中模拟按键失效了??求解!
前因:这段时间小弟玩《三国群英传三》打到三国归魏。因为难度太高,所以在网下查了密技。可是每次要敲击一串字符,故想写一个类拟于按键精灵的东西简化输入。例如,开启游戏Debug-后输入ods3on。加钱-输入money99999。我想做成按F1模拟ods3on,F2模拟money99999.
思路:做一个全局键盘勾子。当在游戏中勾到F1时,用Keybd_Event模拟键盘按下ods3on。当勾到F2时,用用Keybd_Event模拟键盘按下money99999.
问题:完成代码后,在记事本,IE地址栏都可以成功实现按下F1显示ods3on,接下F2显示money99999。可在《三国群英传三》游戏中使用无效。
相关代码:
{sg.dll}
library sg;
uses
SysUtils,
Classes,
WinTypes,
WinProcs,
Messages;
var
IsHooked: Boolean;
HookHandle: HHook;
function HookProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
if (nCode > -1) then
begin
if (wParam = VK_F1) then
begin
if ((lParam shr 31) =1) then
begin
Keybd_Event(Ord( 'O '), MapVirtualKey(Ord( 'O '),0), 0,0);
Keybd_Event(Ord( 'O '), MapVirtualKey(Ord( 'O '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( 'D '), MapVirtualKey(Ord( 'D '),0), 0,0);
Keybd_Event(Ord( 'D '), MapVirtualKey(Ord( 'D '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( 'S '), MapVirtualKey(Ord( 'S '),0), 0,0);
Keybd_Event(Ord( 'S '), MapVirtualKey(Ord( 'S '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( '3 '), MapVirtualKey(Ord( '3 '),0), 0,0);
Keybd_Event(Ord( '3 '), MapVirtualKey(Ord( '3 '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( 'O '), MapVirtualKey(Ord( 'O '),0), 0,0);
Keybd_Event(Ord( 'O '), MapVirtualKey(Ord( 'O '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( 'N '), MapVirtualKey(Ord( 'N '),0), 0,0);
Keybd_Event(Ord( 'N '), MapVirtualKey(Ord( 'N '),0), KEYEVENTF_KEYUP,0);
//MessageBeep(0);
end;
Result := 1;
end//打开密技
else if (wParam = VK_F2) then
begin
if ((lParam shr 31) =1) then
begin
Keybd_Event(Ord( 'M '), MapVirtualKey(Ord( 'M '),0), 0,0);
Keybd_Event(Ord( 'M '), MapVirtualKey(Ord( 'M '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( 'O '), MapVirtualKey(Ord( 'O '),0), 0,0);
Keybd_Event(Ord( 'O '), MapVirtualKey(Ord( 'O '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( 'N '), MapVirtualKey(Ord( 'N '),0), 0,0);
Keybd_Event(Ord( 'N '), MapVirtualKey(Ord( 'N '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( 'E '), MapVirtualKey(Ord( 'E '),0), 0,0);
Keybd_Event(Ord( 'E '), MapVirtualKey(Ord( 'E '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( 'Y '), MapVirtualKey(Ord( 'Y '),0), 0,0);
Keybd_Event(Ord( 'Y '), MapVirtualKey(Ord( 'Y '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), 0,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), 0,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), 0,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), 0,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), KEYEVENTF_KEYUP,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), 0,0);
Keybd_Event(Ord( '9 '), MapVirtualKey(Ord( '9 '),0), KEYEVENTF_KEYUP,0);
//MessageBeep(0);
end;
Result := 1;
end//每城钱财加99999
else
Result := 0;
end
else
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;
function SetHook: Boolean; stdcall;
begin
Result := False;
if IsHooked then
Exit;
HookHandle := SetWindowsHookEx(WH_KEYBOARD, HookProc, HInstance, 0);
Result := HookHandle <> 0;
end;
function RemoveHook: Boolean; stdcall;
begin
Result := False;
if (not IsHooked) and (HookHandle <> 0) then
Result := UnHookWindowsHookEx(HookHandle);
IsHooked := False;
end;
exports
SetHook name 'SetHook ',
RemoveHook name 'RemoveHook ',
HookProc name 'HookProc ';
begin
IsHooked := False;
end.
{sanguo3.exe}
unit sanguo3
...
...
function SetHook; external 'sg.dll ' name 'SetHook ';
function RemoveHook; external 'sg.dll ' name 'RemoveHook ';
procedure TForm1.Button1Click(Sender: TObject);
begin
if SetHook then
Caption := '三国密技-启动 '
else Caption := '三国密技-启动失败 '
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if RemoveHook then
Caption := '三国密技-关闭 '
else Caption := '三国密技-关闭失败 '
end;
...
...
[解决办法]
游戏开发用的不是MFC也不是VCL,SO,游戏一般都是自己开发的一些东西。
所以你得找出这个游戏是如何处理键盘操作的
[解决办法]
如果只是为了达到这样的功能直接用“按键精灵”就可以完成了啊。
如果是为了讨论编程那另当别论。
[解决办法]
楼主 你的问题解决了么?我最近遇到了与你同样的问题 希望能向你请教下:)
QQ 397681150
MSN forever_baggio1994@hotmail.com
[解决办法]
游戏采用DirectInput技术
Keybd_Event是不行的!!
所以需要驱动级别下的IO口的键盘模拟!