Recognize touch as MouseDown event
One suggestion that sounds as a plausible solution is to override WndProc and search for a WM_TOUCH event. More details here: https://stackoverflow.com/a/15785333/3330348
Thanks @PiotrWolkowski
You were correct about the way i should follow... Some other issues appear, but i solved the initial problem overriding the WndProc as showed in the following:
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case Win32.WM_POINTERDOWN:
case Win32.WM_POINTERUP:
case Win32.WM_POINTERUPDATE:
case Win32.WM_POINTERCAPTURECHANGED:
break;
default:
base.WndProc(ref m);
return;
}
int pointerID = Win32.GET_POINTER_ID(m.WParam);
Win32.POINTER_INFO pi = new Win32.POINTER_INFO();
if (!Win32.GetPointerInfo(pointerID, ref pi))
{
Win32.CheckLastError();
}
Point pt = PointToClient(pi.PtPixelLocation.ToPoint());
MouseEventArgs me = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, pt.X, pt.Y, 0);
switch (m.Msg)
{
case Win32.WM_POINTERDOWN:
Console.WriteLine("TOCOU" + pt);
(Parent as Jogo).Form1_MouseDown((this as object), me);
break;
case Win32.WM_POINTERUP:
Console.WriteLine("LEVANTOU");
(Parent as Jogo).Form1_MouseUp((this as object), me);
break;
case Win32.WM_POINTERUPDATE:
//Console.WriteLine("UPDATE");
(Parent as Jogo).Form1_MouseMove((this as object), me);
break;
}
}
It was supported by an "Win32.cs" that can be downloaded here:
https://gist.github.com/RSchwoerer/bc5c04899c0510aefca24f088a79cebf
Hope this is helpful for you;)
To perform touch operations correct you should not use the mouse handler event's just because touch and use the mouse handler it is going through a library built to handle touch as mouse and not what you should be using for a game your able to register your application to handle touch events using the methods from user32.dll
, below is an example of how to implement touch handling in your application.
[DllImport("user32.DLL")]
public static extern bool RegisterTouchWindow(IntPtr hwnd, int ulFlags);
[DllImport("user32.DLL")]
public static extern bool UnregisterTouchWindow(IntPtr hwnd);
public Form1()
{
InitializeComponent();
RegisterTouchWindow(button1.Handle, 0);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnregisterTouchWindow(button1.Handle);
}