原贴:http://topic.csdn.net/u/20081107/17/3ce9a1a1-302b-4422-9979-6e2a6e91af14.html?1566596923我想做一个魔兽里面的像按键精灵一样的软件
现在问题是我没有办法SendKey出小键盘的数字以下是问题:
SendKeys.Send(“1”);
SendKeys.Send("{NUMPAD1}"); 
以上是发送出“1”的,
但是两个都是发送出大键盘的“1”而不是小键盘的“1”
因为在魔兽中我点执行的时候是选中我的“1”队
而不是使用了物品格“1”
最后有网友说出用using System.Runtime.InteropServices; 
[DllImport("User32.dll")] 
public static extern void keybd_event(Byte bVk,Byte bScan,Int32 dwFlags,Int32 dwExtraInfo); 
byte VK_NUM1 = 97;
keybd_event(VK_NUM1,0,0,0);//97是小键盘"1"的键值 就出现一个更奇怪的问题了
在这里执行的时候他连我的“1”队也没有选中
但如果文本框中能得到出“1”那么现在我如何在魔兽中SendKey出小键盘的“1”呢谢谢 

解决方案 »

  1.   

    看来可能是魔兽中,取键盘的调用方式,是直接调用WINDOWS的底层方式取得。
    所以其它方法总是无法正确发送,因为它们都是经过Windows的处理。
    象楼上这位老兄说的,用VC++试试,如果还不行,就是魔兽程序中调用的问题了。
      

  2.   

    using System.Runtime.InteropServices; 
    [DllImport("User32.dll")] 
    public static extern void keybd_event(Byte bVk,Byte bScan,Int32 dwFlags,Int32 dwExtraInfo); 
    byte VK_NUM1 = 97;
    keybd_event(VK_NUM1,0,0,0);//97是小键盘"1"的键值 
    楼主朋友,keybd_event这个API函数在魔兽游戏中肯定是被屏蔽了的,所以没用,至于你那种发送1数字键的也应该没什么大作用.这种方法做出来的辅助功能没什么用.建议使用CALL的方法,先找到这个游戏的调用按键的函数入口地址,然后用远程注入的方法把参数1带入到这个函数中并启动它,这种方法更好!不过就是要自己找函数放口地址,这个可以使用OD来查找!
      

  3.   

    LZ看下这篇,应该对你有帮助的.
    .net实现全局钩子
    http://www.codeproject.com/KB/cs/globalhook.aspx
      

  4.   

    RE:
    看来可能是魔兽中,取键盘的调用方式,是直接调用WINDOWS的底层方式取得。 
    -----------------
    我感觉应该是大键盘的“1”和小键盘的“1”应该是不同的一组命令
    不然在魔兽 星际 红警 中的大键盘1和小键盘1为什么不同
    在我玩的FC游戏中也是不一样的所以我感觉这两个键应该是有区别的谢谢 RE:用vc++试试看啊
    --------------------
    我不会用VS++我只想用C#来解决谢谢 
      

  5.   

    说实话,我还是有点没明白楼主的意思,没玩过魔兽哈
    我的理解是:LZ是不是想取得小键盘中1的事件呢?按下小键盘中的1就执行你想做的事
    但我做了一个测试,
    可以记录用户按下键盘的操作,当我输入小键盘1的时候记录的是:NumPad1
    LZ可不可以试试SendKeys.Send(Keys.NumPad1);这样行不行
      

  6.   

    我测试的时候大键盘和小键盘按下事件记录下来的值也是不一样的
    大是:D1
    小是:NumPad1
      

  7.   

    SendKeys.Send(Keys.NumPad1); 
    不行,提示错误:
    无法从“System.Windows.Forms.Keys”转换为“string”我也关注中!
      

  8.   

    RE:SendKeys.Send(Keys.NumPad1);
    ---------------------
    如果这样可行的话 我就不用问了
    问题是SendKeys.Send(String Key)
    而不是SendKeys.Send(Keys Key)
    他发送的是文字不是键值
      

  9.   

    大键盘和小键盘的ASCII码是不一样的,自己去查下ASCII码值吧
      

  10.   

    RE:大键盘和小键盘的ASCII码是不一样的,自己去查下ASCII码值吧
    以下是我搜索到的
    -----------------------
    你确认你问的是   ASCII   码?   
     如果是ASCII码,哪里的数字都是一样的,从48(0)-57(9)   
      大小键盘上的数字不同的是虚键,不是ASCII
    这是它们的VirKey:   
        
      #define   VK_NUMPAD0                 0x60   
      #define   VK_NUMPAD1                 0x61   
      #define   VK_NUMPAD2                 0x62   
      #define   VK_NUMPAD3                 0x63   
      #define   VK_NUMPAD4                 0x64   
      #define   VK_NUMPAD5                 0x65   
      #define   VK_NUMPAD6                 0x66   
      #define   VK_NUMPAD7                 0x67   
      #define   VK_NUMPAD8                 0x68   
      #define   VK_NUMPAD9                 0x69那这样的话在C#中SendKey.send(??)这里要怎么写呢谢谢 
      

  11.   

    可以的刚才我做了个小程序,功能是shift+W 就是小键盘上的1,试验了下 能够使用回程 哈哈代码如下:
    [DllImport("user32")]
            public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);//注册热键
            [DllImport("user32")]
            public static extern bool UnregisterHotKey(IntPtr hWnd, int id);//解除热键
            [DllImport("user32")]
            public static extern void keybd_event(
                         byte bVk,
                         byte bScan,
                         uint dwFlags,
                         uint dwExtraInfo
                                                  );//模拟键盘消息        byte VK_NUM1 = 97;
            byte VK_NUM2 = 98;
            protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case 0x0312:    //这个是window消息定义的   注册的热键消息
                        if (m.WParam.ToString().Equals("888"))  //这是我们注册的那個热键
                        {
                            keybd_event(VK_NUM1, 0, 0, 0);//表示1键按下
                            keybd_event(VK_NUM1, 0, 0x2, 0);//表示1键弹起
                          
                        }
                        if (m.WParam.ToString().Equals("777"))  //这是我们注册的那個热键
                        {
                            keybd_event(VK_NUM2, 0, 0, 0);//表示2键按下
                            keybd_event(VK_NUM2, 0, 0x2, 0);//表示2键弹起                    }
                        break;
                }
                base.WndProc(ref m);
            } private void button1_Click(object sender, EventArgs e)
            { 
                RegisterHotKey(Handle,888,4,Keys.W);//注册按键,shift+w
                RegisterHotKey(Handle, 777, 4, Keys.E);//shift+E
                button1.Enabled = false;
                MessageBox.Show("OK");        }这样当你按shift+W的时候就是按了小键盘的1键,可以快速吃药了,这样的答案都住满意了吗??(*^__^*) 
      

  12.   

    你可以试试用SendMessage函数发送键盘消息如果不行
    建议去找一个DLL以前在网上见过也用过 很早了名字忘记了
    能够模拟出来硬件按键 对游戏我试过用这个可以
    你可以去网上找模拟键盘