Temat: Aplikacja i bot do niej
OK, przetestowałem rozwiązanie z SendInput. Manipulowanie myszą rozbiłem na dwie funkcje - jedna przygotowuje strukturę z danymi dla SendInput, a druga ją wywołuje. Aby pokazać, że pozycjonowanie myszy działa, przygotowałem prostą aplikację, która rysuje sinusoidę w Paincie. Dzięki temu nauczysz się jak to działa krok po kroku.
Kod nieoptymalizowany i nieuporządkowany, piszę "w biegu". Jako tutorial wystarczy.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace TestMouseClick
{
public partial class Form1 : Form
{
[StructLayout(LayoutKind.Sequential)]
struct HARDWAREINPUT
{
public uint uMsg;
public ushort wParamL;
public ushort wParamH;
}
[StructLayout(LayoutKind.Explicit)]
struct INPUT
{
[FieldOffset(0)]
public int type;
[FieldOffset(4)]
public MOUSEINPUT mi;
}
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
const int INPUT_MOUSE = 0;
const uint MOUSEEVENTF_MOVE = 0x0001;
const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
const uint MOUSEEVENTF_LEFTUP = 0x0004;
const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
[DllImport("user32.dll")]
private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
double radian = 0;
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName == "mspaint")
{
IntPtr WindowHandle = p.MainWindowHandle;
SetForegroundWindow(WindowHandle);
for (int i = 0; i <= 360; i+=10)
{
radian = ( ((double)i) * Math.PI)/180.0;
PrzesunMysz(300 + i, 300 - (int) (100.0*Math.Sin(radian)));
Kliknij();
}
}
}
}
MOUSEINPUT PrzygotujPozycjeMyszy(int x, int y, uint flags)
{
MOUSEINPUT mi = new MOUSEINPUT();
mi.dx = x;
mi.dy = y;
mi.mouseData = 0;
mi.time = 0;
mi.dwFlags = flags;
return mi;
}
void PrzesunMysz(int x, int y)
{
INPUT[] inp = new INPUT[2];
// na początek:
inp[0].type = INPUT_MOUSE;
inp[0].mi = PrzygotujPozycjeMyszy(0, 0, MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE);
// i do pozycji
inp[1].type = INPUT_MOUSE;
inp[1].mi = PrzygotujPozycjeMyszy(x, y, MOUSEEVENTF_MOVE);
SendInput((uint)inp.Length, inp, Marshal.SizeOf(inp[0].GetType()));
}
void Kliknij()
{
INPUT[] inp = new INPUT[2];
inp[0].type = INPUT_MOUSE;
inp[0].mi = PrzygotujPozycjeMyszy(0, 0, MOUSEEVENTF_LEFTDOWN);
inp[1].type = INPUT_MOUSE;
inp[1].mi = PrzygotujPozycjeMyszy(0, 0, MOUSEEVENTF_LEFTUP);
SendInput((uint)inp.Length, inp, Marshal.SizeOf(inp[0].GetType()));
}
}
}
I dowód na to, że działa:
http://www.youtube.com/watch?v=pcaCzuUbToI&
Działa też dla klawiszy, więc jak coś, to potem podeślę.
Adrian Olszewski edytował(a) ten post dnia 05.03.12 o godzinie 19:05