原贴: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”呢谢谢
现在问题是我没有办法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”呢谢谢
所以其它方法总是无法正确发送,因为它们都是经过Windows的处理。
象楼上这位老兄说的,用VC++试试,如果还不行,就是魔兽程序中调用的问题了。
[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来查找!
.net实现全局钩子
http://www.codeproject.com/KB/cs/globalhook.aspx
看来可能是魔兽中,取键盘的调用方式,是直接调用WINDOWS的底层方式取得。
-----------------
我感觉应该是大键盘的“1”和小键盘的“1”应该是不同的一组命令
不然在魔兽 星际 红警 中的大键盘1和小键盘1为什么不同
在我玩的FC游戏中也是不一样的所以我感觉这两个键应该是有区别的谢谢 RE:用vc++试试看啊
--------------------
我不会用VS++我只想用C#来解决谢谢
我的理解是:LZ是不是想取得小键盘中1的事件呢?按下小键盘中的1就执行你想做的事
但我做了一个测试,
可以记录用户按下键盘的操作,当我输入小键盘1的时候记录的是:NumPad1
LZ可不可以试试SendKeys.Send(Keys.NumPad1);这样行不行
大是:D1
小是:NumPad1
不行,提示错误:
无法从“System.Windows.Forms.Keys”转换为“string”我也关注中!
---------------------
如果这样可行的话 我就不用问了
问题是SendKeys.Send(String Key)
而不是SendKeys.Send(Keys Key)
他发送的是文字不是键值
以下是我搜索到的
-----------------------
你确认你问的是 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(??)这里要怎么写呢谢谢
[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键,可以快速吃药了,这样的答案都住满意了吗??(*^__^*)
建议去找一个DLL以前在网上见过也用过 很早了名字忘记了
能够模拟出来硬件按键 对游戏我试过用这个可以
你可以去网上找模拟键盘