Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#.NET Embedded Compact 2013-如何调用GetGestureInfo?_C#_.net_Winapi_Compact Framework_Windows Embedded Compact - Fatal编程技术网

C#.NET Embedded Compact 2013-如何调用GetGestureInfo?

C#.NET Embedded Compact 2013-如何调用GetGestureInfo?,c#,.net,winapi,compact-framework,windows-embedded-compact,C#,.net,Winapi,Compact Framework,Windows Embedded Compact,我必须开发一个C#应用程序,它需要利用高级手势来改善用户体验。为了做到这一点,我需要获得信息 当用户调用某个手势时 因为WndProc在.NETCE中是一个禁忌,所以我使用OpenNETCE的Application2和IMessageFilter类来接收WM流量 在我的MessageFilter中,我查找WM_手势消息,这就是 我卡住了 通过调用此函数,我没有得到任何有意义的结果: 以下是相关代码: 公共类TestMessageFilter:IMessageFilter { [DllImpor

我必须开发一个C#应用程序,它需要利用高级手势来改善用户体验。为了做到这一点,我需要获得信息 当用户调用某个手势时

因为WndProc在.NETCE中是一个禁忌,所以我使用OpenNETCE的Application2和IMessageFilter类来接收WM流量

在我的MessageFilter中,我查找WM_手势消息,这就是 我卡住了

通过调用此函数,我没有得到任何有意义的结果:

以下是相关代码:

公共类TestMessageFilter:IMessageFilter
{
[DllImport(“coredll”,SetLastError=true)]
公共静态外部bool GetGestureInfo(IntPtr hGesture,ref GESTUREINFO lGesture);
公共静态uint WM_手势=0x0119;
公共bool预过滤器消息(参考Microsoft.WindowsCE.Forms.Message m)
{
// ...
如果(m.Msg==WM\u手势)
{
GESTUREINFO gi=新的GESTUREINFO(){
cbSize=(uint)封送处理大小(typeof(GESTUREINFO))
};
bool success=GetGestureInfo(m.LParam,ref gi);
如果(成功)
{
// ...
}
其他的
{
int x=Marshal.GetLastWin32Error();//=>87
}
}
// ...
}
[StructLayout(LayoutKind.Sequential)]
公共结构点
{
公共短x;
公众短消息;
}
[StructLayout(LayoutKind.Sequential)]
公共结构GESTUREINFO
{
公共UInt32 cbSize;
公共旗帜;
公共UInt32 dwID;
公共IntPtr hwndTarget;
公共点位置;
公共UInt32-dwInstanceID;
公共UInt32 dwSequenceID;
公开辩论;
公共UInt32-CBC外部参数;
}
}
它总是给我错误代码87

ERROR_INVALID_PARAMETER
为什么它不起作用? 什么是无效的? 它快把我逼疯了

非常非常感谢

编辑: 我发现这篇文章使用IntPtr而不是 对GestureInfo的引用作为第二个参数

[DllImport("coredll.dll")]
static extern int GetGestureInfo(IntPtr hGestureInfo, [In, Out] IntPtr pGestureInfo);
// ...
GESTUREINFO gi = new GESTUREINFO();
gi.cbSize = 48;

IntPtr outGI = Marshal.AllocHGlobal(48);
Marshal.StructureToPtr(gi, outGI, false);

bool bResult = (GetGestureInfo(lParam, outGI) == 1);
bool bHandled = false;
Marshal.FreeHGlobal(outGI);
Marshal.PtrToStructure(outGI, gi);
// ...
但对我来说,它会产生相同的错误\u无效\u参数错误


没有人有从C#获取手势信息的解决方案或其他方法吗?

我只有使用Windows Embedded Compact 7的经验,但它与2013年应该没有太大区别-您是先启用手势的吗?(您可能收到了WM_手势,但下面是代码):

我选择复制粘贴我们的工作示例;我不记得TGF_GID_DIRECTMANIPULATION是否仅仅为了我们的方便而被排除在TGF_GID_ALL之外,或者是因为我们有问题,抱歉

GetGestureInfo的以下签名适用于我们的设备:

[DllImport("coredll.dll")]
public static extern bool GetGestureInfo(IntPtr hGestureInfo, ref GestureInfo pGestureInfo);
使用structs GestureInfo:

[StructLayout(LayoutKind.Sequential)]
public struct GestureInfo
{
    /// <summary>
    /// Specifies the size of the structure in bytes.  This must be set to Marshal.SizeOf(typeof(GESTUREINFO))
    /// </summary>
    public uint Size;
    /// <summary>
    /// Gesture Flags
    /// </summary>
    public GestureState State;
    /// <summary>
    /// Gesture Id
    /// </summary>
    public GestureKind Kind;
    /// <summary>
    /// HWND of the target winndow
    /// </summary>
    public IntPtr TargetWindow;
    /// <summary>
    /// Coordinates of start of gesture
    /// </summary>
    public short LocationX;
    /// <summary>
    /// Coordinates of start of gesture
    /// </summary>
    public short LocationY;
    /// <summary>
    /// Gesture Instance Id
    /// </summary>
    public uint InstanceId;
    /// <summary>
    /// Gesture Sequence Id
    /// </summary>
    public uint SequenceId;
    /// <summary>
    /// Arguments specific to gesture
    /// </summary>
    public ulong Arguments;
    /// <summary>
    /// Size of extra arguments in bytes
    /// </summary>
    public uint ExtraArguments;
}
我看不出这和你的第一次尝试有什么不同;在MSDN示例中唯一突出的是硬编码大小48(可能意味着读取任何额外参数)

我们确实选择了设置一个自定义窗口过程,但我不明白为什么这种差异会起作用

bool enabled = EnableGestures(Handle, Native.GestureMask.TGF_GID_ALL, 0);
[DllImport("coredll.dll")]
public static extern bool GetGestureInfo(IntPtr hGestureInfo, ref GestureInfo pGestureInfo);
[StructLayout(LayoutKind.Sequential)]
public struct GestureInfo
{
    /// <summary>
    /// Specifies the size of the structure in bytes.  This must be set to Marshal.SizeOf(typeof(GESTUREINFO))
    /// </summary>
    public uint Size;
    /// <summary>
    /// Gesture Flags
    /// </summary>
    public GestureState State;
    /// <summary>
    /// Gesture Id
    /// </summary>
    public GestureKind Kind;
    /// <summary>
    /// HWND of the target winndow
    /// </summary>
    public IntPtr TargetWindow;
    /// <summary>
    /// Coordinates of start of gesture
    /// </summary>
    public short LocationX;
    /// <summary>
    /// Coordinates of start of gesture
    /// </summary>
    public short LocationY;
    /// <summary>
    /// Gesture Instance Id
    /// </summary>
    public uint InstanceId;
    /// <summary>
    /// Gesture Sequence Id
    /// </summary>
    public uint SequenceId;
    /// <summary>
    /// Arguments specific to gesture
    /// </summary>
    public ulong Arguments;
    /// <summary>
    /// Size of extra arguments in bytes
    /// </summary>
    public uint ExtraArguments;
}
[Flags]
public enum GestureState : uint
{
    /// <summary>
    /// The gesture has no associated state
    /// </summary>
    None = 0,
    /// <summary>
    /// The gesture is the beginning of pan gesture
    /// </summary>
    Begin = 1,
    /// <summary>
    /// The gesture is the end of a pan gesture that will transition into a scroll gesture
    /// </summary>
    Inertia = 2,
    /// <summary>
    /// The gesture is the end of a pan gesture
    /// </summary>
    End = 4
}
/// <summary>
/// The kind of gesture.
/// </summary>
public enum GestureKind : uint
{
    /// <summary>
    /// The beginning of a gesture operation.
    /// </summary>
    Begin = 1,
    /// <summary>
    /// The end of a gesture operation.
    /// </summary>
    End = 2,
    /// <summary>
    /// A pan gesture.
    /// </summary>
    Pan = 4,
    /// <summary>
    /// A scroll gesture.
    /// </summary>
    Scroll = 8,
    /// <summary>
    /// A hold gesture.
    /// </summary>
    Hold = 9,
    /// <summary>
    /// A select gesture.
    /// </summary>
    Select = 10,
    /// <summary>
    /// A double-select gesture.
    /// </summary>
    DoubleSelect = 11,
    /// <summary>
    /// Direct manipulation.
    /// </summary>
    DirectManipulation = 12,
}
GestureInfo gesture = new GestureInfo();
gesture.Size = (uint)Marshal.SizeOf(typeof(GestureInfo));
bool result = GetGestureInfo(lParam, ref gesture);