SendInput führt keine Klickmaus aus, wenn ich den Cursor nicht bewege
SendInput nicht durchführen, klicken Sie auf Maus-Taste, wenn ich den cursor bewegen.
Ich würde mich über eine Hilfe dabei, wie ich scheint, kann nicht umbrochen, mein Kopf herum.
Ich habe ein Programm, dass mit der Maus auszuführen, klicken Sie auf Vordergrund-Fenster, in dem ich mich mit SendInput zu emulieren, mit der linken Maustaste aus.
Das Problem ist, dass wenn ich den cursor bewegen Sie auf die position als SendInput machen das klicken, jedoch wenn ich den cursor nicht bewegen als Nein klicken passiert auch durch ich tun, pass x-und y-Punkte der MouseInputData. Ich möchte führen Sie mit der linken Maustaste, ohne die Notwendigkeit von tatsächlich bewegen Sie den cursor an alle.
Balg ist Klasse, ich habe (es Recht einfach und stright forward)
namespace StackSolution.Classes
{
public static class SendInputClass
{
[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetCursorPos(out Point lpPoint);
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
public SendInputEventType type;
public MouseKeybdhardwareInputUnion mkhi;
}
[StructLayout(LayoutKind.Explicit)]
struct MouseKeybdhardwareInputUnion
{
[FieldOffset(0)]
public MouseInputData mi;
[FieldOffset(0)]
public KEYBDINPUT ki;
[FieldOffset(0)]
public HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
struct HARDWAREINPUT
{
public int uMsg;
public short wParamL;
public short wParamH;
}
struct MouseInputData
{
public int dx;
public int dy;
public uint mouseData;
public MouseEventFlags dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[Flags]
enum MouseEventFlags : uint
{
MOUSEEVENTF_MOVE = 0x0001,
MOUSEEVENTF_LEFTDOWN = 0x0002,
MOUSEEVENTF_LEFTUP = 0x0004,
MOUSEEVENTF_RIGHTDOWN = 0x0008,
MOUSEEVENTF_RIGHTUP = 0x0010,
MOUSEEVENTF_MIDDLEDOWN = 0x0020,
MOUSEEVENTF_MIDDLEUP = 0x0040,
MOUSEEVENTF_XDOWN = 0x0080,
MOUSEEVENTF_XUP = 0x0100,
MOUSEEVENTF_WHEEL = 0x0800,
MOUSEEVENTF_VIRTUALDESK = 0x4000,
MOUSEEVENTF_ABSOLUTE = 0x8000
}
enum SendInputEventType : int
{
InputMouse,
InputKeyboard,
InputHardware
}
public static void ClickLeftMouseButton(int x, int y)
{
INPUT mouseInput = new INPUT();
mouseInput.type = SendInputEventType.InputMouse;
mouseInput.mkhi.mi.dx = x;
mouseInput.mkhi.mi.dy = y;
mouseInput.mkhi.mi.mouseData = 0;
//getting current cursor location
Point p;
if (GetCursorPos(out p))
SetCursorPos(x, y);
mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
//returning cursor to previous position
SetCursorPos(p.X, p.Y);
}
}
}
Gleichen ClickLeftMouseButton Funktion nicht auf, wenn ich entfernen erste cursor-position.
public static void ClickLeftMouseButton(int x, int y)
{
INPUT mouseInput = new INPUT();
mouseInput.type = SendInputEventType.InputMouse;
mouseInput.mkhi.mi.dx = x;
mouseInput.mkhi.mi.dy = y;
mouseInput.mkhi.mi.mouseData = 0;
mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
}
Vielen Dank im Voraus.
InformationsquelleAutor der Frage Dmitris | 2011-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Dinge, die Sie berücksichtigen sollten, wenn mit der
SendInput
Funktion.Wenn Sie nicht angeben der
MOUSEEVENTF_ABSOLUTE
Flagge danndx
unddy
(MouseInputData Struktur) sind die relativen Koordinaten der aktuellen Mausposition. Wenn Sie angebenMOUSEEVENTF_ABSOLUTE
danndx
unddy
sind absolute Koordinaten zwischen 0 und 65535. Also, wenn Sie Ihre x-und y-Koordinaten sind Bildschirmkoordinaten verwenden Sie die folgende Funktion zu berechnendx
unddy
:Außerdem, bevor Sie das MOUSEDOWN-und MOUSEUP-Ereignisse über SendInput Sie die Maus zu bewegen, um die Kontrolle, die Sie möchten, klicken Sie auf:
Der obige code geht davon aus, dass
x
undy
sind Bildschirm-pixel-Koordinaten. Berechnen Sie diese Koordinaten für eine Schaltfläche (das Ziel) auf eine winform mit dem folgenden code:Hoffe, das hilft.
InformationsquelleAutor der Antwort Hans