Komunikaty, symulacja myszy?

0

Otóż wypociłem coś takiego:

var
   a, c:TMessage;
   p, b:Tpoint; 
   THandle:Hwnd;
begin
  t:=FindWindow(nil, 'Folder') ;
    p.X:= 243;
    p.Y:= 308;
 a.LParam:=MakeLParam(p.X,p.Y);
    b.X:= 254;
    b.Y:= 498;
 c.LParam:=MakeLparam(b.X,b.Y);
      SendMessage(THandle, WM_MouseMove, 0, a.LParam);
      SendMessage(THandle, WM_LButtonDown, MK_LBUTTON, a.LParam);
      SendMessage(THandle, WM_MOuseMove, MK_LBUTTON , c.LParam);
      SendMessage(THandle, WM_LBUTTONUP, 0, c.LParam);
end;

No i w założeniu miał on przerzucać ikony w folderze "Folder", tylko że nie chodzi mi to i nie mam zielonego pojęcia czemu, wiem źe jest cos takiego jak mouse_event ale wolałbym aby nie "blokowała" mi sie myszka podczas działania programu. Dlatego mam prośbe aby ktoś mi powiedział co robię źle lub może podał inny sposób jak bez blokowania myszki symulować jej prace w tle. Może problem jest banalny i śmieszny, ale dopiero się ucze więc prosze o wyrozumiałość.
Pozdrawiam

0

Dlaczego do tej operacji potrzebujesz kursora myszy? Nie możesz tego zrobić programowo?

0

Nie rozumiem jak programowo? poza tym chodzi mi głównie o to, by nauczyć się właśnie jak symulować ruchy myszki.

0

Programowo, czyli nie przemieszczać obiektów myszą (bo ona jest do wyłącznej dyspozycji użytkownika), a kodem. Jak chcesz z kolei nauczyć się obsługi myszy to po pierwsze używaj jednak mouse_event, a po drugie nie dziw się, że "blokuje", jak to ująłeś, mysz - przecież właśnie to chcesz robić. Ruszać myszą zamiast użytkownika.

0

hum, no to może źle się wyraziłem chodzi mi o to by zasymulować pewne zdarzenie które wykonuje się za pomocą myszki, ale tak by nie miało to namacalnych efektów dla korzystającego z komputera użytkownika , żeby powstało coś w rodzaju drugiej "niewidzialnej" myszki(niezależnej od użytkownika) i wykonywało pewne polecenia. Nie wiem jak to inaczej napisać :-/ .
Pozdrawiam

0

To chcesz to zrobić programowo. Wszystkie rzeczy, które możesz zrobić myszą, możesz zrobić kodem. Ot taki oczywisty przykład: możesz plik usunąć myszą, wybierając z menu podręcznego opcję Usuń, albo po prostu w kodzie programu dać DeleteFile(nazwa_pliku); Oba rozwiązania zadziałają (jak się postarasz z funkcją podobną do DeleteFile, to zadziałają identycznie) - oczywiście to tylko przykład.

Wszystko to kwestia umiejętności obsługi systemu, a nie symulowania myszy. Co jest dokładnie celem twojego programu/danej funkcji?

0

No właśnie nie do końca, bo miał by to być kod uniwersalny, teraz chodzi o folder, ale np. kiedy indziej chciałbym to wykorzystać do kliknięcia w jakimś programie, czy przeciągnięcia jakiegoś elementu w inne miejsce. Moim założeniem nie jest stworzenie programu do przerzucania folderów/ikon ani ich usuwania, ale uniwersalnego kodu, który by wysyłał komunikat że lewy przycisk myszki był naciśnięty, potem że myszka zmieniła pozycje, a na końcu że lewy przycisk był puszczony. W sumie nie jest to na siłe do niczego mi potrzebne(choć mam pare pomysłów na zastosowanie tego [green] ) ale jak już zaczołem się zastanawiać jak coś takiego zrobić to jednak chciałbym znać rozwiązanie. No, i wracając do głównego wątku, i analizując to co napisałeś dochodze do wniosku że jednak, nie da się zrobić tego za pomocą komunikatów, a jeśli się da to prosze oświeć mnie ;], i przy okazji prosze napisać czy w związku z tym cały powyższy kod jest zły lub w ogóle bezsensowny.
Pozdrawiam

0

Ujmę to tak: dla wielu programów symulowanie przez komunikaty nie wystarcza, a mouse_event dodaje informacje w taki sam sposób, jak zwykły sterownik myszy.

Jeśli chodzi Ci o zasymulowanie myszy, możesz jej operacje wykonać tak szybko (i wrócić kursorem na miejsce), aby użytkownik nie zauważył. Bliźniacza funkcja SendInput może przyjmować jako parametr nie pojedyncze zdarzenie myszy, ale całą ich tablicę, co może ułatwić sprawę.

Tylko pozostaje pewien problem do przemyślenia: jak ma program się zachować w sytuacji, gdy na przykład użytkownik w danej chwili przeciąga jakiś obiekt (powiedzmy plik). Musiałby odłożyć obiekt, wykonać szybko operacje, ponownie zacząć przeciągać tamten obiekt. Tego nie da się zrobić w prosty sposób.

Pamiętaj, że kursor myszy jest dla użytkownika i operowanie nim powinno być wykonywane tylko w wyjątkowych przypadkach. Nie ma jednak możliwości użycia jakiegoś 'niewidocznego, wirtualnego kursora'. Niestety.

Zgaduję, że myślisz o automatyzacji ruchu w jakimś programie lub raczej grze.

0

Teraz już rozumiem o co chodzi, no cóż widać będe musiał musiał zapomnieć o komunikatach, a szkoda :-/. W każdym razie dzięki za pomoc i oświecenie mnie :-) .

0

Nie poddawaj sie to nie jest trudne.
Sam zobacz...
Jesli chcesz przesunac mysz na ekranie o x,y pixeli to robisz tak:
mouse_event(MOUSEEVENTF_MOVE, x, y, 0, 0);
Najlepiej zrob procedurke:

procedure PrzesunMyszXY(x,y:integer); // przesuwa mysz o x,y
begin
  mouse_event(MOUSEEVENTF_MOVE, x, y, 0, 0);
end;

I wywolujesz np tak:

  GetCursorPos(pos);     // zwraca pozycje myszki w pos
  x := 100;                    // ustawiamy wspolrzedne myszki
  y := 100;
  PrzesunMyszXY(-pos.X+x,-pos.Y+y);
  • ustawi myszke w 100x100 na ekranie monitora.

Jesli chcesz kliknac przyciskiem to najepiej zrob sobie stale:
const // M Mup R Rup L Lup
LEWY = 2; // 0 0 0 0 1 0
PRAWY = 8; // 0 0 1 0 0 0
SRODKOWY = 32; // 1 0 0 0 0 0

oraz procedurke:

procedure KliknijMysz(przycisk:byte);
begin
  mouse_event(przycisk, 0, 0, 0, 0);
  mouse_event(przycisk*2, 0, 0, 0, 0);
end; 

i klikasz tak:
KliknijMysz(LEWY);

No i zycze milej zabawy :-)

0

mous_event jaki i wszystkie inne sposoby operowania mysza z uzyciem user32.dll nie dizałają w grach diretX-owych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1