ďťż

Ładny brzuch

Witam. Chciałbym napisać sobie takie coś: Mam podany tytuł okna i chciałbym do niego wysłać kombinację klawiszy, np. ALT+ENTER. Powiedzmy jest sobie okno o tytule Super Gra uruchomione przez plik Game.exe. Chodzi o to, żeby do tego i TYLKO do tego okna wysłać określoną kombinację klawiszy. Tylko proszę o WĘDKĘ, a nie rybę. Nie chciałbym zakładać podobnego tematu, jak bym chciał wysłać, powiedzmy CTRL+Spacja ;).



// do usunięcia
Użytkownik Login edytował ten post 17 wrzesień 2008, 21:23
Nie oto chodzi. Chodzi o to, żeby program robił tak, że symulowałby naciśnięcie ALT+ENTER w oknie "Super gra" wywoływanym przez plik game.exe. Zupełnie tak jakbym:
1. Uruchomił grę (plik Game.exe)
2. Wcisnął w jej oknie ALT+ENTER.

Tylko, żeby działo się to niejako "z automatu", a co do tego błędu, to pewnie zapomniałeś dołożyć w Uses modułu Windows - ten typ tak ma, bo jest jeszcze wersja dla linuksa, a tam raczej WinAPI nie użyjesz.

spróbuj tak:
PostMessage(h, WM_KEYDOWN, VK_MENU, 0); PostMessage(h, WM_KEYDOWN, VK_RETURN, 0); PostMessage(h, WM_KEYUP, VK_RETURN, 0); PostMessage(h, WM_KEYUP, VK_MENU, 0);
gdzie h jest uchwytem do okna (HWND)



Dobra, uchwyt okna, tylko jak go zdobyć "po tytule"?

FindWindow(nil,'tytuł'); - pierwsze to klasa okna

Dziękuję, zabieram się za kodowanie.

//EDIT: No i okazuje się, że nie wysyła. Nie ma żadnego komunikatu o błędzie, ale nie działa. Co z tym fantem zrobić?

//EDIT2: Nawet ustawiłem sobie warunek jeśli h=0 (nie znaleziono okna), to pokaż wiadomość o błędzie.
Może kod pokażę:
procedure TForm1.FormCreate(Sender: TObject); var title:string; h:hWnd; i:longInt; j:LongInt; begin i:=0; j:=2; form1.Hide; memo1.Lines.LoadFromFile('Game.ini'); title:=memo1.Lines.Strings[3]; //Wytnij tekst 'Title=' z tytułu okna Delete(title,1,6); ShellExecute(0,'open','Game.exe',nil,nil,SW_Show); Sleep(2000); h:=FindWindow(nil,PChar(title)); if h<>0 then begin PostMessage(h, WM_KEYDOWN, VK_MENU, 0); PostMessage(h, WM_KEYDOWN, VK_RETURN, 0); PostMessage(h, WM_KEYUP, VK_RETURN, 0); PostMessage(h, WM_KEYUP, VK_MENU, 0); end else ShowMessage('Handle Error'); application.Terminate; end;

Już wyjaśniam skąd ta dziwna obsługa plików INI - po prostu Lazarus nawet przez TIniFile zapisuje do rejestru, więc tego nie mogłem zastosować. A wartość Title jest zawsze w czwartej linijce pliku (Strings[3]).
Użytkownik Rave edytował ten post 18 wrzesień 2008, 13:25
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •