首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Keybd_Event为什么在游戏中模拟按键失效了?求解!解决方案

2012-02-22 
Keybd_Event为什么在游戏中模拟按键失效了??求解!前因:这段时间小弟玩《三国群英传三》打到三国归魏。因为难

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口的键盘模拟!

热点排行