Mam projekt, który obejmuje otwieranie wielu klientów okna, a następnie symulowanie kliknięć myszy w ramach każdego z tych procesów. Udało mi się wysłać wiadomość do wielu wystąpień Notatnika za pomocą Win32 API i SendMessage. Kod, który pracuje dla mnie jest następująca:Web Automation Mouse Kliknięcie
Process[] notepads = Process.GetProcessesByName("notepad");
foreach (Process proc in notepads)
{
IntPtr handle = proc.Handle;
IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Edit", null);
if (child != null)
{
MessageBox.Show("Child was found, sending text");
SendMessage(child, 0x000C, 0, "test");
}
}
}
Ten wysyła „test” do każdej instancji Otworzyłem Notatnika, bez względu na to ile. Jak widzisz, robię iterację po każdej instancji procesu i po prostu zapętlając wiadomość. Nie było wcale trudne ...
Ostatecznym celem nie jest Notatnik, a raczej rozszerzenie Microsoft Awesomium. Pobrałem uchwyt okna, a następnie nazwę klasy potomnej (Awesomium), która jest Chrome_RenderWidgetHostHWND. Stamtąd próbowałem wysyłać zdarzenia myszy przez refaktoryzację typów zmiennych w Sendmessage w celu ich zsynchronizowania i lParam do odczytania przez system. Tutaj jest to, że kod:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
Korzystanie kilka przykładów znalazłem zmontować lParam poprzez to:
int x = 834;
int y = 493;
IntPtr lParam = (IntPtr)((y << 16) | x);
IntPtr wParam = IntPtr.Zero;
Używam haki Globalny myszy do wykrywania zdarzeń Press We wszystkich okien potomnych, a kiedy naciśnij przycisk, aby powtórzyć proces i kliknij, nic nie jest wysyłane. Wiem, że robię coś głupiego, co powoduje, że kliknięcia myszą nie są wysyłane. W każdym razie tutaj jest ostateczna struktura kodu, którą mam. Wszelkie porady lub wskazówki będą mile widziane. Dzięki.
private void button2_Click(object sender, EventArgs e)
{
Process[] notepads = Process.GetProcessesByName("client");
foreach (Process proc in notepads)
{
IntPtr handle = proc.Handle;
string mine = Convert.ToString(proc);
MessageBox.Show(mine);
IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Chrome_RenderWidgetHostHWND", null);
if (child != null)
{
int x = 834;
int y = 493;
IntPtr lParam = (IntPtr)((y << 16) | x);
IntPtr wParam = IntPtr.Zero;
SendMessage(child, 0x201, wParam, lParam);
SendMessage(child, 0x202, wParam, lParam);
}
}
}
Realizując kilka błędów za pomocą mojego kodu, w końcu wkopałem się w WinInspector i odzyskałem wszystkie polecenia potrzebne do zainicjowania kliknięcia myszą. Jestem takim noobem. Dla każdego w przyszłości, tutaj są wiadomości potrzebne do aktywacji kliknięcia na Awesomium przy użyciu Win32, najprawdopodobniej jest to takie samo dla wszystkich. WM_PARENTNOTIFY, WM_MOUSEACVTIVATE, WM_LBUTTONDOWN. Seria tych trzech poleceń powiadomi rodzica, że użytkownik aktywował mysz, następnie wykonuje krótką, najmocniejszą akcję, a następnie naciska lewy przycisk. Mam nadzieję, że to pomaga komuś. – user2578424
Powinieneś udzielić odpowiedzi, a następnie ją zaakceptować. – Xcelled194