Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#| SharpDX.XInput |如何检测控制器上的按钮是否被按下一次且未被按下_C#_Sharpdx_Gamepad_Xinput - Fatal编程技术网

C#| SharpDX.XInput |如何检测控制器上的按钮是否被按下一次且未被按下

C#| SharpDX.XInput |如何检测控制器上的按钮是否被按下一次且未被按下,c#,sharpdx,gamepad,xinput,C#,Sharpdx,Gamepad,Xinput,最近我尝试创建一个XBOX 360控制器驱动程序。 我需要检测按钮是否被按下或按下。所以,如果你按住它,它也会调用一次特定的函数,就像你按下按钮一样。 这是我的代码(我在另一篇文章中找到了这个解决方案,但它对我不起作用) 使用系统; 使用系统图; 使用系统线程; 使用System.Windows.Forms; 使用SharpDX.XInput; 使用System.Runtime.InteropServices; 命名空间Windows\u XBOX\u控制器\u驱动程序 { 公共部分类Form1

最近我尝试创建一个XBOX 360控制器驱动程序。 我需要检测按钮是否被按下或按下。所以,如果你按住它,它也会调用一次特定的函数,就像你按下按钮一样。 这是我的代码(我在另一篇文章中找到了这个解决方案,但它对我不起作用)

使用系统;
使用系统图;
使用系统线程;
使用System.Windows.Forms;
使用SharpDX.XInput;
使用System.Runtime.InteropServices;
命名空间Windows\u XBOX\u控制器\u驱动程序
{
公共部分类Form1:Form
{
[DllImport(“user32.dll”,CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
公共静态外部无效鼠标事件(uint-dwFlags、uint-dx、uint-dy、uint-cButtons、uint-dwExtraInfo);
专用静态控制器;
新的私营国家;
国有私营企业;
私有整数x,y;
公共表格1()
{
初始化组件();
设置();
}
私有无效循环(对象发送方、事件参数)
{
如果(!enabledcb.Checked)
{
返回;
}
//
stateNew=controller.GetState();
///////////////////////////////////
x=stateNew.Gamepad.RightThumbX;
y=stateNew.Gamepad.RightThumbY;
x/=1000;
y/=1000;
//////////////////////////////
int movementX=x;
int movementY=y;
movementX*=(int)sensnud.Value;
movementY*=(int)sensnud.Value;
movementX/=2;
movementY/=2;
movementY*=-1;
////////////////////////
如果(x>buffernud.Value | | x<-buffernud.Value)
{
Cursor.Position=新点(Cursor.Position.X+movementX,Cursor.Position.Y);
}
如果(y>buffernud.Value | | y<-buffernud.Value)
{
Cursor.Position=新点(Cursor.Position.X,Cursor.Position.Y+movementY);
}
//钮扣
选中按钮();
}
私有无效复选按钮()
{
//左击
if(stateOld.Gamepad.Buttons==GamepadButtonFlags.LeftShoulder&&stateNew.Gamepad.Buttons==GamepadButtonFlags.LeftShoulder)
{
左键单击();
}
//b右击
if(stateOld.Gamepad.Buttons==GamepadButtonFlags.RightBeall&&stateNew.Gamepad.Buttons==GamepadButtonFlags.RightBeall)
{
右键单击();
}
//dpad向上按钮传感器向上
if(stateOld.Gamepad.Buttons==GamepadButtonFlags.DPadUp&&stateNew.Gamepad.Buttons==GamepadButtonFlags.DPadUp)
{
sennud.UpButton();
}
//dpad向下按钮传感器向下
如果(stateOld.Gamepad.Buttons==GamepadButtonFlags.DPadDown&&stateNew.Gamepad.Buttons==GamepadButtonFlags.DPadDown)
{
sensnud.DownButton();
}
stateOld=stateNew;
}
私有void LeftClick()
{
int X=游标.Position.X;
int Y=游标.Position.Y;
鼠标事件(0x02 | 0x04,(uint)X,(uint)Y,0,0);
睡眠(100);
}
私有void右键单击()
{
int X=游标.Position.X;
int Y=游标.Position.Y;
鼠标事件(0x08 | 0x10,(uint)X,(uint)Y,0,0);
睡眠(100);
}
私有void LoadController()
{
控制器=新控制器(UserIndex.One);
如果(!controller.IsConnected)
{
MessageBox.Show(“错误”,“似乎没有通过USB连接XBOX 360控制器!”);
Application.Exit();
}
}
私有void updateLoop_Tick(对象发送方,事件参数e)
{
xlbl.Text=“偏移量X:+X;
ylbl.Text=“偏移量Y:+Y;
}
私有void applybtn\u单击(对象发送方,事件参数e)
{
loop.Interval=(int)updatenud.Value;
}
私有无效设置()
{
LoadController();
}
}
}
使用此代码,您仍然可以按住按钮,它将垃圾邮件的点击功能或任何正在调用

我还尝试使用一个“按下”布尔值,按下时设置为true,不按下时设置为false。它只在“pressed”为==false时进行调用

也不管用

对于那个问题,你还有别的解决办法吗

如果这是一个糟糕的问题,很抱歉。我阅读了问题的规则和提示,搜索了重复的问题,但除了从中获得第一个解决方案的问题外,没有找到任何其他问题。

我已经找到了答案 愚蠢的错误:我忘了反转if子句中按钮按下的第一个条件

对于那个问题,你还有别的解决办法吗

这是我前几天为另一个引擎写的课程。但我认为它同样适用于任何其他引擎。我希望这能帮助你:

基本上,它会检查关键点是否在当前帧中保持,而不是在最后一帧中保持。它们的关键状态存储在字典中

以下是重要的部分:

public bool IsKeyPress(Keys key)
{
    bool isCurrentlyPressed = WaveServices.Input.KeyboardState.IsKeyPressed(key);
    bool previouslyReleased = this.previousKeyStates[key] == ButtonState.Release;

    this.previousKeyStates[key] = isCurrentlyPressed ? ButtonState.Pressed : ButtonState.Release;

    return  isCurrentlyPressed && previouslyReleased;
}

Thx这和我自己发现的一样,但无论如何,Thx;)
public bool IsKeyPress(Keys key)
{
    bool isCurrentlyPressed = WaveServices.Input.KeyboardState.IsKeyPressed(key);
    bool previouslyReleased = this.previousKeyStates[key] == ButtonState.Release;

    this.previousKeyStates[key] = isCurrentlyPressed ? ButtonState.Pressed : ButtonState.Release;

    return  isCurrentlyPressed && previouslyReleased;
}