Strona 1 z 1

SendMessage zamykanie aplikacji do której wysyłam komunikat

Nowy postNapisane: środa, 10 marca 2010, 13:33
przez Koziol
Witam,
staram się stworzyć pseudobota do Lineage2. (Od razu mówię że nie ma on grać za mnie tylko umożliwiać wysyłanie komunikatów do okna które jest zminimalizowane).
► 

Sytuacja wygląda tak:
Za pomocą SendMessage wysyłam komunikat WM_KEYDOWN i WM_KEYUP oraz kod klawiszy od F1 - F12.
Wszystko jest ok pierwsze dwa wysłane komunikaty "przechodzą" - jest efekt w grze, niestety przy następnym pojawia się problem gra samoczynnie się wyłącza czy jest możliwe że posiada ona jakieś zabezpieczenie przeciwko wysyłaniu komunikatów czy może trzeba ustawić jakąś wartośc w lParam.

Z góry dziękuje za pomoc.

Re: SendMessage zamykanie aplikacji do której wysyłam komunikat

Nowy postNapisane: środa, 10 marca 2010, 13:47
przez Cyfrowy Baron
To raczej jakiś błąd systemowy. Wysyłasz komunikat przez API systemu Windows, a gra działa w oparciu o DirectX, więc możliwie, że na tym polu coś nie działa prawidłowo. Oczywiście mogę się mylić.

Dużo gier po minimalizacji przestaje działać.

Re: SendMessage zamykanie aplikacji do której wysyłam komunikat

Nowy postNapisane: środa, 10 marca 2010, 14:28
przez Koziol
Cyfrowy Baron napisał(a):To raczej jakiś błąd systemowy. Wysyłasz komunikat przez API systemu Windows, a gra działa w oparciu o DirectX, więc możliwie, że na tym polu coś nie działa prawidłowo. Oczywiście mogę się mylić.


Czy istnieje sposób wysyłania komunikatów przez DX lub OpenGL?

Cyfrowy Baron napisał(a):Dużo gier po minimalizacji przestaje działać.


Test przeprowadzałem na zmaksymalizowanym oknie.


Zle powiedziałem z tą minimalizacja wygląda to mniej wiecej tak:

Re: SendMessage zamykanie aplikacji do której wysyłam komunikat

Nowy postNapisane: czwartek, 11 marca 2010, 08:25
przez Cyfrowy Baron
Podałeś zbyt mało danych, by można było cokolwiek ustalić. Musisz przeprowadzić testy i zebrać więcej danych. Wiele gier w przypadku nieprawidłowego zakończenia generuje plik z logami błędów, więc sprawdź czy ta gra również tego nie robi.

Kolejna sprawa, jeżeli to możliwe, uruchom grę w trybie okienkowym i sprawdź czy błąd również występuje.

Błąd pojawia się po trzecim komunikacie, ale czy na pewno dotyczy to liczby komunikatów, a nie konkretnego komunikatu. Wyślij do aplikacji kilka identycznych komunikatów by ustalić, czy błąd wywołuje kolejny komunikat, czy konkretny komunikat.

Zwiększ odstępy pomiędzy kolejnymi komunikatami, być może zbyt szybko są wysyłane.

Zamiast funkcji SendMessage, która wysyła komunikat i oczekuje na odpowiedź czy komunikat doszedł, użyj funkcji PostMessage, która tylko wysyła komunikat i nie czeka na jego wykonanie.

To na razie na tyle, gdy będziesz znał odpowiedzi na te pytania, być może uda się ustalić coś więcej.

Re: SendMessage zamykanie aplikacji do której wysyłam komunikat

Nowy postNapisane: czwartek, 11 marca 2010, 11:31
przez Koziol
Co do pytań logów nie ma niestety, grę uruchamiam zawsze w trybie okienkowym, zawsze testowalem na tym samym komunikacie. Ale nie wiem czemu po kilku zmianach aplikacja zaczęła chodzić poniżej kod:
Kod: Zaznacz cały
#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[])
{
    HWND hWND;
    hWND=NULL;
   
    if(hWND = FindWindow(NULL, "Lineage II"))
            cout << "Znaleziono okno Lineage II\n";
    else
            cout << "Nieznaleziono okna Lineage II\n";
   
    Sleep(4000);
   
    int i =0, z=5;
    int sleeptime=4000;
   
    for(;i<z;i++)
    {
        if(hWND = FindWindow(NULL, "Lineage II"))
                cout << "Znaleziono okno Lineage II\n";
        else
        {
            cout << "Nieznaleziono okna Lineage II\n";
            break;
        }
        PostMessage(hWND, WM_SYSKEYDOWN, VK_F1, 0);
        //Sleep(1000);
        //PostMessage(hWND, WM_KEYUP, VK_F1, 0);
        Sleep(sleeptime*2);
        cout << "Send Message: " << i << "\n";
                 
    }
   
   
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

Nie wiem czemu nie wysyłanie komunikatu o podniesionym klawiszu, wykorzystanie zamiast WM_KEYDOWN -> WM_SYSKEYDOWN oraz wykrywanie okna przed wysłaniem każdego komunikatu pomogło.

Re: SendMessage zamykanie aplikacji do której wysyłam komunikat

Nowy postNapisane: czwartek, 11 marca 2010, 11:47
przez Cyfrowy Baron
Przypuszczam, że zastosowałeś wszystko na raz, czyli nie wiadomo co pomogło.

wykrywanie okna przed wysłaniem każdego komunikatu pomogło.


A jak inaczej mogłeś wysłać komunikat do okna, jeżeli nie pobrałeś do niego uchwytu, gdyż tak wynika z twojej wypowiedzi?

Co do WYM_SYSKEYDOWN, to tego komunikatu używa się np. gdy chcesz wysłać wciśnięcie klawisza Alt + jakiś klawisz. Tego komunikatu używa się również, gdy żadne okno nie jest ustawione na fokus klawiatury.

Nie wspomniałeś, że tworzysz aplikację konsolową, a to właśnie może wywoływać błąd, gdyż aplikacja wykonuje się w tle i nie ustawia fokusa klawiatury na siebie, dlatego WM_SYSKYEDOWN zadziałało.

Zamiast funkcji SendMessage użyłeś PostMessage, więc to również mogło wpłynąć na to, że aplikacja działa prawidłowo.

Re: SendMessage zamykanie aplikacji do której wysyłam komunikat

Nowy postNapisane: czwartek, 11 marca 2010, 17:43
przez Koziol
Cyfrowy Baron napisał(a):Przypuszczam, że zastosowałeś wszystko na raz, czyli nie wiadomo co pomogło.
A jak inaczej mogłeś wysłać komunikat do okna, jeżeli nie pobrałeś do niego uchwytu, gdyż tak wynika z twojej wypowiedzi?


Wykonalem to w kolejności:
- PostMessage (nie pomoglo).
- Wykrywanie wskaźnika przed wysłaniem każdego po kolei komunikatu (nie tylko przy uruchomieniu aplikacji).
- Użyłem WM_SYSKYEDOWN i zadziałało.

Cyfrowy Baron napisał(a):Nie wspomniałeś, że tworzysz aplikację konsolową, a to właśnie może wywoływać błąd, gdyż aplikacja wykonuje się w tle i nie ustawia fokusa klawiatury na siebie, dlatego WM_SYSKYEDOWN zadziałało.


Pierwsze przymiarki do tej aplikacji robilem na okienkach ale bylo to nazwijmy bardziej pracochłonne więc testy przeprowadzam na aplikacji konsolowej.