Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Mini-kompedium wiedzy na temat klikania w nieaktywnych oknach


Rekomendowane odpowiedzi

Opublikowano

Witam

:)

Chciałbym przedstawić 2 metody klikania na nieaktywnych (w tym zminimalizowanych) oknach, za pomocą funkcji:

ControlClick

_WinAPI_PostMessage

 

Przejdźmy zatem do rzeczy:

 

1.Klikanie za pomocą funkcji ControlClick

 

Coż, jest to funkcja stworzona w tym celu więc omówię ją pokrótce:

ControlClick ( "title", "text", controlID [, button [, clicks [, x [, y ]]]] )

Parametry:
"title" - Tytuł okna w którym będziemy chcieli wywołać kliknięcie (nazwę trzeba przepisać dokładnie)
"text" - Tekst okna, możemy umieścić w tym parametrze  " " (chodzi o cudzysłów)
controlID - bardzo ważny parametr, bez niego szanse na pomyślne wykonanie funkcji jest nikłe
button - "left", "right", "middle" - tak, nic innego jak przycisk, który ma być użyty. wpisując "" zostanie wciśnięty LPM
clicks - ile razy przycisk ma byc wciśnięty
x,y - koordynanty w oknie, temat rozwinę poniżej

 

Aby znaleźć potrzebne dane, włączamy AU3 Info w SciTe, skrót - Ctrl+F6. Oto co nam się pojawi:

 

Obrazek

 

Aktywujemy nasze okno, a następnie "chwytając" za celownik nad czerwoną linią przeciągamy go na przycisk/etc. w który chcemy kliknąć. "Puszczamy" celownik.

 

Teraz przechodzimy do zakładki Control, szukamy takiej informacji:

 

Obrazek

 

Podkreślone nieudolnym zielonym kolorem ID o wartości 3 to nasz ControlID potrzebny do funkcji, widzimy także nazwę przycisku (BUtton1) oraz jego pozycje w GUI (8,8) i rozmiar (209,73). Jeśli zauważyłeś, jest tam też coś takiego jak ControlClick Coords - cóż, jest to pozycja, względem przycisku, gdzie znajdował sie kursor podczas "puszczenia" celownika. Można ich użyć, bowiem posiadając ControlID nie musimy sie martwić o współrzędne kliknięcia, co możemy po znac po tym, że wartości x, y sa opcjonalnymi argumentami funkcji, byleby mieściły się w liczbach Size.

 

Pora uzupełnić funkcje, a będzie to wyglądać tak:

ControlClick("Testing GUI", "", 3, "")

Jak widać nie uwzględniłem koordynantów i ilości kliknięć, jednak jest to zbędne.

Dla przećwiczenia działania funkcji, oto kod programiku, na którym demonstrowałem wyszukiwanie danych:

 


#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Testing GUI", 218, 82, 192, 124)

$Button1 = GUICtrlCreateButton("Button1", 8, 8, 209, 73)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
MsgBox(0, "Gah!", "It works!")
EndSwitch
WEnd

 

 

Jednak, co gdy nie możemy znaleźć ControlID? Posłużymy się drugą funkcją:

 

2. Klikanie za pomocą funkcji _WinAPI_PostMessage

 

Ta funkcja służy nie tylko do klikania, ma szereg innych zastosowań, jednak na chwilę obecną zajmiemy się tylko kliknięciem. Oto jej wygląd:

#include <WinAPI.au3>

_WinAPI_PostMessage($hWnd, $iMsg, $iwParam, $ilParam)

$hWnd - unikalny uchwyt do okna, do którego zostanie wysłana wiadomość
$iMsg - tak jak wspominałem, ten parametr ma na celu "poinformować" funkcje, jakiego rodzaju działanie chcemy wywołać
$iwParam - pierwszy z dwóch parametrów, zależny od rodzaju wysyłanej wiadomości
$ilParam - drugi parametr, tak jak wyżej

 

Jeśli jesteś spostrzegawczy, od razu powinieneś zauważyć, że nie wiemy jaki jest uchwyt do okna (to nie to samo co tytuł!), jak nazywa sie parametr odpowiadający za kliknięcie i jak wpisać koordynanty.

 

Aby odpowiedzieć na te pytania, będziemy potrzebowali jeszcze dwóch funkcji:

WinGetHandle()

_WinAPI_MakeLong()

 

Zacznijmy od początku. Pierwszy parametr to hWnd czyli Handle, a zatem musimy zapisać ów handle do zmiennej:

$hWND = WinGetHandle("title", "text")

; "title" - dokładny tytuł okna
; "text" - wypełniamy jak w przypadku ControlClick - " "

 

Okey, mamy uchwyt, drugi parametr to $iMsg, czyli okreslenie rodzaju wysłanej wiadomości - dla nas bedą to kliknięcia, więc zamieszczę listę odpowiednich Globalnych:

#include <WindowsConstants.au3> ; - Musimy koniecznie zadeklarować ten include, aby móc korzystać z poniższych stałych!![/center]



[center]$WM_LBUTTONDBLCLK - Dwukrotne wciśnięcie lewego przycisku myszy (LPM)
$WM_LBUTTONDOWN - wciśnięcie i przytrzymanie w dole LPM
$WM_LBUTTONUP - anulowanie makra wyżej, czyli po prostu puszczenie LPM

$WM_MBUTTONDBLCLK - to samo co wyżej tylko odnosi sie do środkowego przycisku
$WM_MBUTTONDOWN
$WM_MBUTTONUP

$WM_RBUTTONDBLCLK - to samo co wyżej tylko odnosi się do prawego przycisku
$WM_RBUTTONDOWN
$WM_RBUTTONUP

 

Wybieramy, co nam pasuje lecz uwaga! Chcąc raz kliknąć najpierw piszemy funkcję która wciśnie np. LPM a następnie funkcje, która puści LPM

 

Trzeci parametr nas nie interesuje, wpisujemy tylko ""

 

Czwarty parametr to koordynanty kliknięcia względem okna programu. Zaraz zaraz! tu jest miejsce na jedną liczbę/zmienną nie na dwie! Jak więc wpakować tam kordy? Nic prostszego:

do tego posłuży nam funkcja _WinAPI_MakeLong. Jest to funkcja, która z dwóch wartości tworzy jedną, jednocześnie zachowując wartości, z których ta nowa się składa, innymi słowy: Longword.

 

Będzie to wyglądało następująco:

$LoWord = _WinAPI_MakeLong(pozycja_x, pozycja_y)

 

gotowe, wszystkie potrzebne dane zostały uzyskane. Aby nieco rozjaśnić te bazgroły wykonamy przykładowe kliknięcie

; Chcemy kliknąć w oknie o nazwie "OKNO", w miejsce o współrzędnych (159,200), oto kod:

#include <WinAPI.au3>

$hWnd = WinGetHandle("OKNO", "") ; - pobieramy uchwyt okna
$LoWo = _WInAPI_MakeLong(159, 200) ; - tworzymy Longword dla współrzędnych

_WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, "", $LoWo) ; - wciskamy Lewy Przycisk Myszy
_WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, "", $LoWo) ; - puszczamy Lewy Przycisk Myszy

;Dla zaoszczędzienia miejsca może to też wyglądać tak:
_WinAPI_PostMessage(WinGetHandle("OKNO", ""), $WM_LBUTTONDOWN, "", _WinAPI_MakeLong(159, 200))
_WinAPI_PostMessage(WinGetHandle("OKNO", ""), $WM_LBUTTONUP, "", _WinAPI_MakeLong(159, 200))

 

Jeśli znajdziecie jakieś błędy/nieścisłości - edytuję. Pozdrawiam :)

A tak, i informacje o WinAPI podsunął mi 4ggr35510n

czwartkowy posmak w ustach przypomina
że nie ma sensu owijać w bawełnę
zmarzniętego truchła

przez latarnię ktoś przerzucił sznur
cumuje statek w bezpieczną przystań

czuję jak na skroniach zasycha sól
...

Weteran
Opublikowano

Twój skrypt mi nie działa, a _WinAPI jest bardzo ciekawe.

Wyskakuje błąd z tymi $WM_LBUTTONDOWN i tym drugim.

Dodałem Global $WM_LBUTTONDOWN, $WM_LBUTTONUP i działa, ale nie klika ;/

 

Poradzisz coś? :D

1329036830-U154499.png
Opublikowano

Sądzę, że prościej :P

 

Func SendKey($hWnd, $vk_key)
DllCall("User32.dll", "int", "PostMessage", "hwnd", ControlGetHandle($hWnd, "", "Edit1"), "int", 0x100, "int", $vk_key, "int", 0)
EndFunc

 

Trochę przerobić i będzie jak złoto ...

Opublikowano

Cóż, sposobów jest kilka :)

 

Sopelek - dodam info w pierwszym poście.

czwartkowy posmak w ustach przypomina
że nie ma sensu owijać w bawełnę
zmarzniętego truchła

przez latarnię ktoś przerzucił sznur
cumuje statek w bezpieczną przystań

czuję jak na skroniach zasycha sól
...

  • 2 tygodnie później...
Opublikowano

mi wyskakuje coś takiego przy wykonaniu tego

>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\tom\Desktop\autoit\nie aktywne.au3"

proszę o pomoc :)

Kocham mpcforum.pl!!!

18706.png

Opublikowano

jeśli posiada takowe zabezpieczenia, trzeba je uśpić :)

 

xander-x - mozna kod ?

czwartkowy posmak w ustach przypomina
że nie ma sensu owijać w bawełnę
zmarzniętego truchła

przez latarnię ktoś przerzucił sznur
cumuje statek w bezpieczną przystań

czuję jak na skroniach zasycha sól
...

Opublikowano

prosze kod jest taki

 

#include <WinAPI.au3>

#include <WindowsConstants.au3>

 

$hWnd = WinGetHandle("22 - Paint", "") ; - pobieramy uchwyt okna

$LoWo = _WInAPI_MakeLong(80, 250) ; - tworzymy Longword dla współrzędnych

 

_WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, "", $LoWo) ; - wciskamy Lewy Przycisk Myszy

_WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, "", $LoWo) ; - puszczamy Lewy Przycisk Myszy

Kocham mpcforum.pl!!!

18706.png

Opublikowano

Czy aby na pewno wartość WinGetHandle jest prawidłowa? nie wiem, ja tu błędów nie widze, a weź to opraw w jakąś funkcję...

czwartkowy posmak w ustach przypomina
że nie ma sensu owijać w bawełnę
zmarzniętego truchła

przez latarnię ktoś przerzucił sznur
cumuje statek w bezpieczną przystań

czuję jak na skroniach zasycha sól
...

  • 3 lata później...
Opublikowano

Ta metoda z funkcją _WinAPI_PostMessage działa tylko wtedy gdy okno o które nam chodzi jest aktywne? Mi chodzi o Firefoxa i jak uruchomie dodatkowo np. Google Chrome który jest na pierwszym planie, to już nie klika w Firefoxie. Cos robie źle czy ta funkcja nie działa w niekatywnych oknach? ControlD w ogóle nie mogę zastosować, bo AutoIT Info nie znajduje mi żadnych potrzebnych do niej parametrów.

#include <WindowsConstants.au3>
#include <WinAPI.au3>

While 1
$hWND = WinGetHandle("Mozilla Firefox", "")
$LoWo = _WInAPI_MakeLong(551, 391)
_WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, "", $LoWo)
_WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, "", $LoWo)
Sleep(1000)
WEnd
Opublikowano

 

Ta metoda z funkcją _WinAPI_PostMessage działa tylko wtedy gdy okno o które nam chodzi jest aktywne? Mi chodzi o Firefoxa i jak uruchomie dodatkowo np. Google Chrome który jest na pierwszym planie, to już nie klika w Firefoxie. Cos robie źle czy ta funkcja nie działa w niekatywnych oknach? ControlD w ogóle nie mogę zastosować, bo AutoIT Info nie znajduje mi żadnych potrzebnych do niej parametrów.

#include <WindowsConstants.au3>
#include <WinAPI.au3>

While 1
$hWND = WinGetHandle("Mozilla Firefox", "")
$LoWo = _WInAPI_MakeLong(551, 391)
_WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, "", $LoWo)
_WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, "", $LoWo)
Sleep(1000)
WEnd

Przeciez to jest temat o nieaktywnych oknach  :ninja:

Na 99% masz zly uchwyt do okna.

  • 4 tygodnie później...
  • 8 miesięcy temu...
  • 1 miesiąc temu...
Opublikowano

Temat nie jest daleko, ale minął ponad miesiąc i to pewnie odkop roku (jak dotychczas).

Tak jak kolega wyżej:
W poradniku jest, że można się podpiąć pod nieaktywne okno i bot sobie tam klika. A co zrobić, żeby wpisywał on tam tekst i używał makra (F1, F2, Enter, BS)?

Co do WinGetHandle(" ", " ") nie mam wątpliwości jak działa, ale _WinAPI_MakeLong określa nam piksel na którym działamy? Czy da radę zastąpić to sferą, którą działamy? Wrzucić do tego wczytywanie koloru piksela w nieaktywnej karcie i odpowiednią reakcję na dany kolor?

  • 1 rok później...
  • 1 rok później...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...