Мне нужно разработать приложение C#, которое должно использовать расширенные жесты, чтобы улучшить работу пользователя. Для этого мне нужно получить информацию , когда пользовательский вызов вызывается определенным жестом.C# .NET Embedded Compact 2013 - Как вызвать GetGestureInfo?
Поскольку WndProc является табу в .NET CE, я использую классы OpenNETCE Application2 и IMessageFilter для получения WM-трафика.
В моем MessageFilter я ищу сообщения WM_GESTURE, и вот где Я застрял.
Я просто не получить какой-либо значимый результат, вызвав эту функцию:
https://msdn.microsoft.com/en-us/library/ee503217.aspx
BOOL GetGestureInfo(
HGESTUREINFO hGestureInfo
PGESTUREINFO pGestureInfo
);
Вот соответствующий код:
public class TestMessageFilter : IMessageFilter
{
[DllImport("coredll", SetLastError = true)]
public static extern bool GetGestureInfo(IntPtr hGesture, ref GESTUREINFO lGesture);
public static uint WM_GESTURE = 0x0119;
public bool PreFilterMessage(ref Microsoft.WindowsCE.Forms.Message m)
{
// ...
if (m.Msg == WM_GESTURE)
{
GESTUREINFO gi = new GESTUREINFO() {
cbSize = (uint)Marshal.SizeOf(typeof(GESTUREINFO))
};
bool success = GetGestureInfo(m.LParam, ref gi);
if (success)
{
// ...
}
else
{
int x = Marshal.GetLastWin32Error(); // => 87
}
}
// ...
}
[StructLayout(LayoutKind.Sequential)]
public struct POINTS
{
public short x;
public short y;
}
[StructLayout(LayoutKind.Sequential)]
public struct GESTUREINFO
{
public UInt32 cbSize;
public UInt32 dwFlags;
public UInt32 dwID;
public IntPtr hwndTarget;
public POINTS ptsLocation;
public UInt32 dwInstanceID;
public UInt32 dwSequenceID;
public UInt64 ullArguments;
public UInt32 cbExtraArguments;
}
}
Он всегда дает мне код ошибки 87.
ERROR_INVALID_PARAMETER
Почему это не работает? Что недействительно? Это сводит меня с ума ...
Многие, большое спасибо заранее.
Редактировать: Я нашел этот пост on the msdn forums, который использует 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);
// ...
Но для меня это ошибка ERROR_INVALID_PARAMETER.
Неужели никто не имеет решения или другого подхода для получения GestureInfo с C#?