SendMessage zamykanie aplikacji do której wysyłam komunikat

dział ogólny

SendMessage zamykanie aplikacji do której wysyłam komunikat

Nowy postprzez Koziol » środa, 10 marca 2010, 13:33

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.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox

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

Nowy postprzez Cyfrowy Baron » środa, 10 marca 2010, 13:47

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ć.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4721
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 443
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

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

Nowy postprzez Koziol » środa, 10 marca 2010, 14:28

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:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox

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

Nowy postprzez Cyfrowy Baron » czwartek, 11 marca 2010, 08:25

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4721
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 443
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

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

Nowy postprzez Koziol » czwartek, 11 marca 2010, 11:31

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.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox

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

Nowy postprzez Cyfrowy Baron » czwartek, 11 marca 2010, 11:47

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4721
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 443
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

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

Nowy postprzez Koziol » czwartek, 11 marca 2010, 17:43

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.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 0 gości

cron