Sendinput til at simulere klik med musen
HejJeg skal lave et program der udfører et klik på et vilkårligt sted på skærmen (altså ikke nødvendigvis i eget program).
Til formålet regner jeg med at jeg skal bruge Sendinput API'en, men da jeg ikke har prøvet at rode med API før volder dette mig en del problemer. Jeg har fundet følgende kode:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;
class Click
{
[DllImport("user32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.U4)]
static extern int SendInput(
[MarshalAs(UnmanagedType.U4)] int nInputs,
INPUT[] pInputs, int cbSize);
[StructLayout(LayoutKind.Explicit)]
struct INPUT
{
[FieldOffset(0), MarshalAs(UnmanagedType.U4)] public int type;
[FieldOffset(4)] public MOUSEINPUT mi;
// [FieldOffset(4)] public KEYBDINPUT ki;
// [FieldOffset(4)] public HARDWAREINPUT hi;
}
const int INPUT_MOUSE = 0;
const int INPUT_KEYBOARD = 1;
const int INPUT_HARDWARE = 2;
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
public int dx;
public int dy;
[MarshalAs(UnmanagedType.U4)] public int mouseData;
[MarshalAs(UnmanagedType.U4)] public int dwFlags;
[MarshalAs(UnmanagedType.U4)] public int time;
[MarshalAs(UnmanagedType.SysUInt)] public IntPtr dwExtraInfo;
}
const int MOUSEEVENTF_ABSOLUTE = 0x8000;
public int ClickAt(Point p)
{
MOUSEINPUT mi = new MOUSEINPUT();
mi.dx = p.X;
mi.dy = p.Y;
mi.dwFlags = MOUSEEVENTF_ABSOLUTE;
INPUT[] inputs = new INPUT[1];
inputs[0].type = INPUT_MOUSE;
inputs[0].mi = mi;
int ret = SendInput(1, inputs, Marshal.SizeOf(typeof(INPUT)));
return ret;
}
}
Til at kalde ClickAt metoden bruger jeg følgende kode:
private void button1_Click(object sender, System.EventArgs e)
{
Point p = new Point();
p.X = int.Parse(textBox1.Text);
p.Y = int.Parse(textBox2.Text);
Click cl = new Click();
label1.Text = cl.ClickAt(p).ToString();
}
Dette virker dog tilsyneladende ikke på trods af at Sendinput returnerer 1, hvilket ifølge msdn betyder at den har udført 1 click( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/sendinput.asp ).
Er der en der kan se hvad der er galt med ovenstående kode eller muligvis lave en metode fra scratch hvis det er nemmere der udfører et klik på skærmen?
