konto usunięte

Temat: Aplikacja i bot do niej

Witam :)
Postanowiłem iść trochę dalej z C#, a dokładniej wyznaczyłem sobie trudniejsze zadanie, lecz nie do końca wiem, jak je ugryźć ;/

Napisałem sobie w C# prosty programik w którym po kliknięciu myszką gdzieś na formie, kulka przesuwa się w te miejsce. I teraz chciałem się Was poradzić, jak zrobić aby przy pomocy zewnętrznego programu imitować kliknięcie myszki? Czyli włączam zewnętrzny program, wpisuję np współrzędne gdzie ma kulka się przesunąć i ona się przesuwa w tym głównym programie. Coś na zasadzie bota.

Temat: Aplikacja i bot do niej

Próbowałeś szukać odpowiedzi w google?

Wyniki wskażą Ci metodę postępowania, czyli jak odszukać okno danej aplikacji i jak wysłać do niej komunikaty klawiatury bądź kliknięcia (PostMessage, SendKeys i inne). Bez użycia PInvoke się nie obejdzie.

Zapytanie Google.

Wyniki:
1. http://stackoverflow.com/questions/2416748/how-to-simu...
2. http://stackoverflow.com/questions/986743/simulate-cli...
3. http://stackoverflow.com/questions/2416748/how-to-simu...
4. http://www.gamedev.net/topic/321029-how-to-simulate-a-...

konto usunięte

Temat: Aplikacja i bot do niej

SendKeys działa, ale w obrębie aplikacji w której jest użyty, a do innych aplikacji exe wysyła co najwyżej tekst, natomiast symulacja wciśniętego klawisza nie działa. Szukam po sieci od kilku godzin, ale coś marny efekt ;/
Krzysztof Mierzejewski

Krzysztof Mierzejewski SharePoint
Consultant

Temat: Aplikacja i bot do niej

Możesz użyć gotowca lub napisać sam.

konto usunięte

Temat: Aplikacja i bot do niej

Ten drugi link co podałeś do MSDN sprawdzałem, i przy pomocy tak napisanego kodu, mogę jedynie wysłać tekst, ale już symulacja naciśnięcia klawisza nie działa niestety na zewnętrzne aplikacje :(

konto usunięte

Temat: Aplikacja i bot do niej

`Piotr Sowa edytował(a) ten post dnia 11.03.12 o godzinie 20:22

konto usunięte

Temat: Aplikacja i bot do niej

Ok już mam wszystko elegancko :) Zostało mi ogarnąć, jak zrobić, aby po odpaleniu tego "bota" dane zostały wysłane do innej aplikacji, ale tak żeby nie otwierało jej okna, tzn żeby wysłało w tle, bo aktualnie mam tak:


SetForegroundWindow(calculatorHandle);
Thread.Sleep(100);
InputSimulator.SimulateKeyPress(VirtualKeyCode.RETURN);

Jak wywalę SetForegroundWindow to aplikacja zaraz w mig, podnosi zużycie procesora, i jest taki efekt jakby się zawiesiła, skutkiem czego jest brak symulacji naciśnięcia klawisza.Paweł Cyrklaf edytował(a) ten post dnia 05.03.12 o godzinie 17:59

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

konto usunięte

Temat: Aplikacja i bot do niej

Testowałem i faktycznie działa tak jak powinno :)

Następna dyskusja:

Aplikacja bazodanowa do obs...




Wyślij zaproszenie do