C#在游戏应用程序中按住键
我正在尝试制作一个C#应用程序,它将控制一个游戏。我试着做的是:按住A键150毫秒,按住左箭头500毫秒等等。 我搜索了很多,发现了下面的代码。我的程序首先瞄准游戏,然后按住键C#在游戏应用程序中按住键,c#,key,fullscreen,keyup,C#,Key,Fullscreen,Keyup,我正在尝试制作一个C#应用程序,它将控制一个游戏。我试着做的是:按住A键150毫秒,按住左箭头500毫秒等等。 我搜索了很多,发现了下面的代码。我的程序首先瞄准游戏,然后按住键 I'm holding the keys this way: Keyboard.HoldKey(Keys.Left); Thread.sleep(500); Keyboard.ReleaseKey(Keys.Left); 以下是键盘类: public class Keyboard { public Keyb
I'm holding the keys this way:
Keyboard.HoldKey(Keys.Left);
Thread.sleep(500);
Keyboard.ReleaseKey(Keys.Left);
以下是键盘类:
public class Keyboard
{
public Keyboard()
{
}
[StructLayout(LayoutKind.Explicit, Size = 28)]
public struct Input
{
[FieldOffset(0)]
public uint type;
[FieldOffset(4)]
public KeyboardInput ki;
}
public struct KeyboardInput
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public long time;
public uint dwExtraInfo;
}
const int KEYEVENTF_KEYUP = 0x0002;
const int INPUT_KEYBOARD = 1;
[DllImport("user32.dll")]
public static extern int SendInput(uint cInputs, ref Input inputs, int cbSize);
[DllImport("user32.dll")]
static extern short GetKeyState(int nVirtKey);
[DllImport("user32.dll")]
static extern ushort MapVirtualKey(int wCode, int wMapType);
public static bool IsKeyDown(Keys key)
{
return (GetKeyState((int)key) & -128) == -128;
}
public static void HoldKey(Keys vk)
{
ushort nScan = MapVirtualKey((ushort)vk, 0);
Input input = new Input();
input.type = INPUT_KEYBOARD;
input.ki.wVk = (ushort)vk;
input.ki.wScan = nScan;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
SendInput(1, ref input, Marshal.SizeOf(input)).ToString();
}
public static void ReleaseKey(Keys vk)
{
ushort nScan = MapVirtualKey((ushort)vk, 0);
Input input = new Input();
input.type = INPUT_KEYBOARD;
input.ki.wVk = (ushort)vk;
input.ki.wScan = nScan;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
SendInput(1, ref input, Marshal.SizeOf(input));
}
public static void PressKey(Keys vk)
{
HoldKey(vk);
ReleaseKey(vk);
}
}
它可以在记事本/浏览器等环境下工作,但在任何游戏中都不能工作,无论是全屏模式还是窗口模式。
你能帮我弄清楚如何在全屏应用程序/游戏中按住按键吗?
谢谢 按住A键150毫秒,按住左箭头500毫秒
看看这是否有效:
Keyboard.HoldKey((byte)Keys.A, 150);
Keyboard.HoldKey((byte)Keys.Left, 500);
使用:
public class Keyboard
{
[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
const int KEY_DOWN_EVENT = 0x0001; //Key down flag
const int KEY_UP_EVENT = 0x0002; //Key up flag
public static void HoldKey(byte key, int duration)
{
int totalDuration = 0;
while (totalDuration < duration)
{
keybd_event(key, 0, KEY_DOWN_EVENT, 0);
keybd_event(key, 0, KEY_UP_EVENT, 0);
System.Threading.Thread.Sleep(PauseBetweenStrokes);
totalDuration += PauseBetweenStrokes;
}
}
}
公共类键盘
{
[DllImport(“user32.dll”,SetLastError=true)]
静态外部无效keybd_事件(字节bVk、字节bScan、int-dwFlags、int-dwExtraInfo);
const int KEY_DOWN_事件=0x0001;//KEY DOWN标志
const int KEY_UP_事件=0x0002;//KEY UP标志
公共静态void保持键(字节键,int持续时间)
{
int totalDuration=0;
while(总持续时间<持续时间)
{
keybd_事件(键,0,键向下_事件,0);
keybd_事件(key,0,key,UP_事件,0);
系统。线程。线程。睡眠(两次行程之间的暂停);
总持续时间+=两次行程之间的暂停;
}
}
}
我是用Windown API和SendInput方法实现的。您可以让它使用它,这对于按住键非常有用:
public class Keyboard
{
const int PauseBetweenStrokes = 50;
[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
const int KEY_DOWN_EVENT = 0x0001; //Key down flag
const int KEY_UP_EVENT = 0x0002; //Key up flag
public static void HoldKey(byte key, int duration)
{
keybd_event(key, 0, KEY_DOWN_EVENT, 0);
System.Threading.Thread.Sleep(duration);
keybd_event(key, 0, KEY_UP_EVENT, 0);
}
}
你不能仅仅用谷歌搜索一段代码,将其转储到应用程序中,然后期望它能工作。定义
不工作
?这是一个非常宽泛的术语,到底是什么不起作用?游戏通常通过DirectX获得键盘,这是一种非常不同的处理方式。将Windows输入消息发送到此类应用程序是没有用的。[PDF]。其他的都是我自己做的,只是我不习惯windows API。我所说的不工作是指我的应用程序瞄准了游戏,并试图保持/释放箭游戏,但在我身上什么都没有发生。如果我按下键盘上的箭头,它就会工作。@GSerg你能给我一个小例子,我应该怎么做?你好。感谢您的回答,但遗憾的是,效果与我第一篇文章中的代码相同:它在记事本/浏览器等中工作,但在游戏窗口中不工作。我将HoldKey()更改为快速按下/释放键,直到达到持续时间。看看效果是否更好…还是一样,似乎游戏以不同的方式处理按键:(只是注意到我没有包括“PauseBetweenStrokes”:const int PauseBetweenStrokes=50;
我认为这不会有多大区别。很抱歉,它没有起作用…祝你好运!是的,我试过1、10和20:(似乎不是每个游戏都能处理这样的操作。你能解释一下你的意思吗?