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;
...
...
思路:做一个全局键盘勾子。当在游戏中勾到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;
...
...
...全文
相关推荐
keybd_event,mouse_event 模拟产生键盘事件、鼠标事件的使用
模拟鼠标、模拟键盘事件,有时候非常有用,比如在自动化测试中
全面掌握UPX 1.08手动脱壳技术
本文还有配套的精品资源,点击获取 简介:在IT安全领域,脱壳技术是理解恶意软件或病毒的重要步骤之一,而UPX是最流行的加壳工具之一。本教程“手动脱壳第二课 UPX 1.08”深入探讨了UPX 1.08版本的手动脱壳过程。课程内容包括分析PE文件结构,识别UPX壳特征,寻找原始入口点,解密和解压原始代码,修复重定位,以及创建未加壳文件。通过实践学习,学员将深入理解UPX的工作...
vc模拟按键实现代码,基于keybd_event
因为需要输入字符需要,便寻求到keybd_event方法,写了一个测试例子。主要功能是,模拟按键输入一段字符串。
基于keybd_event函数在window系统下的模拟键盘输入源码
一个基于keybd_event函数在window系统下的模拟键盘输入源码,可以实现在winodw系统下输入任何字符串
unity模拟键盘按键输入
1、Unity模拟组合键输入组件 //模拟按键A: keybd_event(Keys.A, 0, 0, 0); //模拟组合键CTRL + A: //public const int KEYEVENTF_KEYUP = 2; //keybd_event(Keys.ControlKey, 0, 0, 0); //keybd_event(Keys.A, 0, 0, 0); //keybd_event(Keys.ControlKey, 0, KEYEVENTF_KEYUP, 0);


Windows SDK/API
