Uchwyt okna i praca na nim

0

Witam wszystkich.

Chciałem zrobić prostego bota do gry, który by tylko klikał myszką w odpowiednie miejsce.
Bota który to robi na pełnym ekranie zrobiłem bez problemu takim schematem:
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);

Lecz nie mogę sobie poradzić z grą w oknie gdyż można je przemieszczać.
Myslałem nad jakimś uchwyceniem jej i wtedy w jej rozdzielczości napisać
wyżej podanym schematem, lecz nie wiem jak się za to zabrać..

Prosiłbym was o jakieś porady i pomysły jak najlepiej to zrobić, żeby
klikało w odpowiednie miejsce bez różnicy gdzie aktualnie lezy okno gry..

Pozdrawiam.

1

Sróbuj tak. Pobierz uchwyt okna gry przez FindWindow, następnie na jego podstawie obszar tego gry przy użyciu GetWindowRect i oblicz w zależności od lewej i gornej krawędzi okna gdzie ma klikać. Do pokazywania współrzędnych można wykorzystać prosty program tdwininfo z torry.net. Nie wiem czy powyższy sposób zda egzamin, ale innego nie znam.

1

Tak jak napisał olesio. Masz przykład który wciska na kalkulatorze z Windows XP (przy widoku standardowym, w nowszych wersjach Windows jest inny kalkulator i mogą się współrzędne przycisków nie zgadzać) kolejno cyfry 1,2 i 3. dodatkowo wcześniej ustawia okno kalkulatora na wierzch a jeżeli jest zminimalizowane to je przywraca.

var
  hWin: HWND;
  r: TRect;
  x, y: Integer;
  i: Integer;
begin
  hWin:= FindWindow(nil, 'Kalkulator');
  if IsIconic(hWin) then
    ShowWindow(hWin, SW_RESTORE)
  else
    SetForegroundWindow(hWin);
  GetWindowRect(hWin, r);
  x:= r.Left + 35;
  y:= r.Top + 200;
  for i:=0 to 2 do
  begin
    x:= x + 40;
    SetCursorPos(x,y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);
  end;
end;

A niżej taki sam przykład który (przynajmniej teoretycznie) powinien działać nie zależnie od wersji Windows ponieważ pobiera sobie współrzędne przycisków ale w grze raczej (no chyba, że to gra w stylu saper) miejsca klikania muszą być na sztywno więc raczej zastosowanie będzie miał pierwszy przykład..

var
  hWin, hBtn: HWND;
  r: TRect;
  x, y: Integer;
  i: Integer;
begin
  hWin:= FindWindow(nil, 'Kalkulator');
  if IsIconic(hWin) then
    ShowWindow(hWin, SW_RESTORE)
  else
    SetForegroundWindow(hWin);
  for i:=1 to 3 do
  begin
    hBtn:= FindWindowEx(hWin, 0, nil, PAnsiChar(IntToStr(i)));
    GetWindowRect(hBtn, r);
    x:= r.Left + 1;
    y:= r.Top  + 1;
    SetCursorPos(x,y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);
  end;
end;
0

Dziękuję bardzo za przykłady, bardzo mi pomogliście.

A dałoby się aby klikało nawet przy zminimalizowanym oknie?
Ale to już chyba grubsza zabawa?

1

Nie da się. Gdy okno jest zminimalizowane musisz je przywrócić choćby na czas kliknięcia (bo niby gdzie miałbyś klikać). Inna sprawa była by gdyby to był program (wiem że gra to też program ale wiecie o co chodzi) i miał kontrolki np. buttony to można by zamiast klikać wysyłać do nich komunikaty o kliknięciu.

0

Ale to jest gra przeglądarkowa?

0

Nie, nie jest przeglądarkowa.
Jest to gra mmocrpg "MuOnline", Jeśli to coś komuś mówi ;)

A wiecie co poradzić jak ShowWindow(hWin, SW_RESTORE) nie pokazuje zminimalizowanego okna?

0

To ja może zademonstruję tą myszkę o której napisałem w komentarzu =)

user image

Czy da się nią poruszać jesli kursor myszy jest poza oknem?

2

Oto sposób przywracania okna, który zastosowałem dla Opery, bo inaczej się nie dało niż pobrać uchwyt na podstawie nazwy pliku wykonywalnego przeglądarki, kod wykorzystuje mój moduł, którego kod jest dostępny na: http://4programmers.net/Delphi/Gotowce/Uchwyt_na_podstawie_nazwy_pliku_exe_programu - może to coś Tobie pomoże.

//...
var
  Opera_H : HWND;
begin
  // Pobranie uchwytu na podstawie nazy Aplikacji
  Opera_H := ExeProcessToHWnd('opera.exe');
  // Jeżeli Opera uruchomiona to...
  if Opera_H > 0 then
  begin
    // Jeżeli Opera schowana do Ikony to...
    if IsIconic(Opera_H) = True then
    begin
      // ... Przywróć okno Opery
      SendMessage(Opera_H, WM_SYSCOMMAND, SC_RESTORE, 0);
    end
    else
    begin
      // Jeżeli okno opery nie schowane do ikony uaktywnik okno
      SetForeGroundWindow(Opera_H);
    end;
//...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.