Dlaczego FindWindow nie odnajduje okna systemowego notatnika?

2018-08-31 00:37
Mroczny Karaluch
0

Witam.

Piszę, ponieważ posiadam problem z delphi i funkcją findwindow.
Chciałem tylko, żeby delphi wpisywało w notatnik np. "q", jednak po prostu to nie działa.
Ogólnie to nazwa okna notatnika to "Bez Tytułu - Notatnik", a procedurę mam taką:

procedure Hook;
begin;

H := FindWindow( Pchar(Form1.Edit3.text), nil );
GetWindowThreadProcessID(H, @PID);
IDProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);
if H < 1 then
begin
application.Title:='ERROR';
Form1.Timer1.Enabled := false;
ShowMessage( 'Error!' );
end else begin
Form1.Timer1.Enabled := true;
end;
end;

Gdy w Edit3 wpisuję taką nazwę okna: Bez Tytułu - Notatnik to niestety pojawia się napis "Error" jak w procedurze. Nie wyświetla się tylko jak wpiszę "notepad". Czemu w takim razie nazwą okna ma być notepad, skoro nazwa jego okna jest inna?

W timerze natomiast mam po prostu wcisnijklawisz(edit1.text).

function wcisnijklawisz(x :string): string;
var

  h: HWND;

  i : integer;

begin

  i := 0;

begin

  if x ='Q' then

  i := 81;

   if x ='E' then

  i := 13;

h := FindWindow(nil, Pchar(Form1.Edit3.text));
PostMessage(h, WM_KEYdown, i, 0);
PostMessage(h, WM_KEYUP, i, 0);
end;
end;

Proszę o pomoc. Dziękuję.

edytowany 1x, ostatnio: furious programming, 2018-08-31 01:15

Pozostało 580 znaków

2018-08-31 01:12
2

Nazwa klasy okna systemowego notatnika to notepad, a nie to co widnieje na belce tytułowej. Jeśli potrzebujesz pobrać uchwyt okna na podstawie jego tytułu, to w pierwszym parametrze przekaż nil, a tytuł w drugim.

Poza tym, w ogóle nie walidujesz danych zwracanych przez systemowe funkcje, a to bardzo źle.


edytowany 3x, ostatnio: furious programming, 2018-08-31 01:20

Pozostało 580 znaków

2018-08-31 11:20
Mroczny Karaluch
0

Jak w takim razie sprawdzić tytuł okno, skoro tytułem nie jest to, co widnieje?

Pozostało 580 znaków

2018-08-31 11:35
1

To użyj zamiast FindWindow, EnumProcess lub tasklist do pobrania PID.

Pozostało 580 znaków

2018-08-31 17:51
0
Mroczny Karaluch napisał(a):

Jak w takim razie sprawdzić tytuł okno, skoro tytułem nie jest to, co widnieje?

Czytaj uważnie co się do Ciebie pisze.

Tytuł okna to ten tekst, który widzisz na belce tytułowej (jak sama nazwa zresztą wskazuje). Tyle że pierwszy parametr funkcji FindWindow pobiera nazwę klasy okna, a nie jego tytuł – ten podaje się w drugim parametrze. Więcej na ten temat znajdziesz jak zwykle w dokumentacji.

Tak więc jeśli znasz nazwę klasy okna, to podaj ją w pierwszym parametrze. Jeśli znasz tytuł okna, to podaj go w drugim. Jeśli znasz obie wartości, to możesz podać obie. A jeśli nie znasz żadnej, to użyj jakiegoś narzędzia do pozyskania takich informacji.


Zwróć też uwagę na to, że wiele okien w systemie może mieć taki sam tytuł i znajomość nazwy klasy okna umożliwi ich rozróżnienie. Może być też tak, że kilka okien ma taką samą nazwę klasy okna i taki sam tytuł – np. kilka instancji systemowego notatnika. Wtedy FindWindow zwróci uchwyt pierwszego pasującego.

Aby móc rozróżnić okna lub wykonać jakąś czynność dla nich wszystkich, należy wykorzystać to o czym napisał poprzednik post wyżej. Można też opierać się na stanie okna i pobierać uchwyty innymi funkcjami, np. GetForegroundWindow czy GetActiveWindow (zależy od przypadku i wymagań).


edytowany 5x, ostatnio: furious programming, 2018-09-03 00:50

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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