Wysyłanie kliknięć myszki do zminimalizowanego okna.

0

Witam.
W jaki sposób mogę wysłać kliknięcia myszki do zminimalizowanego okna? Chcę, by mysz była klikana dajmy na to w timerze w odpowiednim miejscu. Coś takiego:

SendMessage(h, WM_LBUTTONDOWN, MK_LBUTTON, 600);

nie bardzo działa.

SetCursorPos(800, Screen.Height-900); //set cursor to Start menu coordinates
mouse_event(MOUSEEVENTF_LEFTDOWN,0, 0, 0, 0); //press left button
mouse_event(MOUSEEVENTF_LEFTUP,0, 0, 0, 0); //release left button

Działa, lecz nie przy zminimalizowanym oknie.

1

W jaki sposób mogę wysłać kliknięcia myszki do zminimalizowanego okna?

To zdanie przeczy idei klikania - skoro okno jest zminimalizowane (a więc ukryte) to jak niby ma być możliwość kliknięcia w cokolwiek na nim? Trochę to nielogiczne, więc nie zdziwię się, jeśli komunikaty te są ignorowane.

Lepiej by było gdybyś napisał po co chcesz to zrobić, bo wydaje mi się, że niepotrzebnie kombinujesz.

0

Np. hotkeye można wciskać w programie, gdy on jest zminimalizowany:

SendMessage(h, WM_KEYdown, 116, 0);
SendMessage(h, WM_KEYUP, 116, 0);

Potrzebuję coś takiego samego z tym że z mouse clickiem.

0

Z tego co widzę, komunikat powinien być normalnie przetworzony. Jest jedno ale - wParam dla komunikatów WM_LBUTTONDOWN i WM_LBUTTONUP powinien zawierać zestaw flag, natomiast współrzędne powinny być przekazane w parametrze lParam. Tak więc spróbuj z poniższym kodem:

SendMessage(Handle, WM_LBUTTONDOWN, 0, MakeLParam(116, 0));
SendMessage(Handle, WM_LBUTTONUP, 0, MakeLParam(116, 0));

Więcej informacji na temat tych komunikatów znajdziesz w dokumentacji:

0

@furious programming: wątpię aby mu to zadziałało dla zminimalizowanej aplikacji ... bo po kliknięciu poza okno straci focus. Bez globalnego hooka na mysz raczej się nie obejdzie.

0

@woolfik: powinno zadziałać - ten kod znalazłem na innym forum w odpowiedzi na identyczny problem.

0

Kiepsko działa. Raz kliknie, raz nie. Na dodatek w inne miejsca klika. Dziwne.

0

@Smerf123: a jak okno jest widoczne to ten kod też sprawia problemy?

0

Tak

1

To może podaj kod co tam sam naklepałeś. Przy wysyłaniu WM_LBUTTONDOWN jako wParam funkcji SendMessage powinno być MK_LBUTTON (przy WM_LBUTTONUP 0 tak jak jest) ale tutaj ważniejsza jest inna sprawa co Ty w ogóle chcesz klikać jakieś kontrolki (np. buttony) czy co?

0

Faktycznie @kAzek - słusznie zauważyłeś, że brakuje flagi dla wParam - poprawiony kod:

SendMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, MakeLParam(116, 0));
SendMessage(Handle, WM_LBUTTONUP, 0, MakeLParam(116, 0));
0

Tylko że potrzebuję, by mi coś klikalo LPM w tej pozycji: (800,Screen.Height-900)) w zminimalizowanym oknie.

0

Sprawdź czy funkcja GetWindowRect zwróci prawidłowe dane - nie wiem czy zadziała dla zminimalizowanego okna. Ale jeśli faktycznie zadziała to w polach left i top dostaniesz pozycję lewego górnego roku okna, które to możesz przetłumaczyć na wewnętrzne koordynaty dla okna, np. za pomocą funkcji ScreenToClient.

1

GetWindowRect na zminimalizowanym oknie zwraca bzdury:

gwr.png

Trzeba się pogodzić z faktem, że okno zminimalizowane swojego obszaru nie ma — a w każdym razie nie jest to prawdziwy obszar okna, bo umieszczony gdzieś w ujemnym kosmosie i o nieprawdziwym rozmiarze.

0
Smerf123 napisał(a):

Tylko że potrzebuję, by mi coś klikalo LPM w tej pozycji: (800,Screen.Height-900)) w zminimalizowanym oknie.

Może i chłopaki się ze mną nie zgodzą ale są sytuacje gdzie czegoś takiego się nie da wykonać. Z prostej przyczyny jeśli okno aplikacji ma rozmiar 100x100 i przesunięte jest do lewej krawędzi ekranu to nie przełożysz kliknięcia 800x900 (screen) na np pozycję 80x90 w oknie. Z tego co rozumiem potrzebujesz np kliknąć w jakiś obiekt (np button) w oknie zminimalizowanej aplikacji więc najlepiej byłoby pobrać konkretny handle tego obiektu i przekazać message bezpośrednio do tego obiektu. Znając nazwę obiektu i nazwę procesu aplikacji używając WinAPI dostaniesz handla obiektu i możesz z nim robić co Ci się żywnie podobna.

0

Dało by się coś takiego zrobić, gdyby aplikacja wysyłająca komunikaty znała pozycję i rozmiar okna odbierającego komunikaty i gdyby okno docelowe nie było nigdy przesuwane w inne miejsce (podczas całego życia procesu). A tak to nic z tego nie wyjdzie, bo okno zminimalizowane rozkłada funkcję GetWindowRect. Tak więc pomysł upadł (to niezgodne z zachowaniem okien i przeczy idei klikania).

Jeśli by chcieć klikać w przyciski i inne elementy interfejsu to owszem można pobrać sobie uchwyty kontrolek i do nich bezpośrednio wysyłać komunikaty. Jednak widzę, że ten przypadek jest inny i bardziej wygląda na próbę stworzenia bota do jakiejś gry niepełnoekranowej, który to mógłby sobie działać razem z tą grą, ale jednocześnie nie zajmować pulpitu, tak aby można było w tym czasie robić coś innego.

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