FindWindow - nie znajduje okna w XE5

FindWindow - nie znajduje okna w XE5
RD
  • Rejestracja:około 12 lat
  • Ostatnio:12 miesięcy
  • Postów:212
0

Mam pewien problem Poniżej kod programu wyszukujący Handle:

Kopiuj
hw := FindWindow(nil , 'Moja');  //Jak znajdzie moja to hw <> 0

Teraz tworze nowy program w którym ustawiam.

Kopiuj
Application.Title := 'Moja';

Jak go kompiluje w D7 to

Kopiuj
hw := FindWindow(nil , 'Moja')

znajduje okno, natomiast jak go skompiluje w xe5 to juz tego okna nie widzi.

Pytanie dlaczego czy chodzi tutaj o PAnsiChar, PWideChar?

dodanie znacznika <code class="delphi"> oraz dodanie tagów wątku - fp

edytowany 2x, ostatnio: flowCRANE
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około godziny
  • Lokalizacja:Gorlice
1

W Delphi 7 Application było niewidocznym oknem w nowszych Delphi (nie pamiętam od jakiej wersji) tak nie jest.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
olesio
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
1

@Rafał D: za pewne jest tak, jak pisze @kAzek. Skoro identyczny kod pod różnymi środowiskami dla identycznych warunków poza samym IDE daje w tym przypadku inny rezultat. Zawsze możesz stworzyć sobie formatkę z Memo i Buttonem. Testując poniższym kodem czy na liście okien coś znajdziesz. Tylko za pewne nie znajdziesz.

Kopiuj
function EnumWindowsProc(AHandle : HWND; ALParam : LParam) : BOOL; stdcall
var
  ControlName, ControlText : array[0..255] of Char;
begin
  Result := True;
  GetClassName(AHandle, ControlName, SizeOf(ControlName));
  SendMessage(AHandle, WM_GETTEXT, SizeOf(ControlText), Integer(@ControlText));
  Form1.Memo1.Lines.Add(Format('$%X %s %s', [AHandle, ControlName, ControlText]))
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  EnumWindows(@EnumWindowsProc, 0);
end;

Jeżeli kombinujesz w ten sposób co opisałeś, aby mieć okno do którego mają docierać jakieś Twoje komunikaty, to zawsze możesz albo wysyłać je z stałą - parametrem HWND_BROADCAST zamiast uchwytu. Wtedy komunikat "rozejdzie się" po wszystkich, utworzonych oknach głownych w systemie, które mogą go odebrać i obsłużyć. Ewentualnie mozesz też utworzyć przez funkcję CreateWindow(Ex)A/W ukryte okno, o własnej unikalnej nazwie klasy i nim się posługiwać przy odbiorze późnejszych komunikatów. Więcej opisano na mnóstwie stron go wygooglowania oraz MSDNie.


Pozdrawiam.
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:19 dni
0

Sprawdź, czy masz w dpr-ze jak poniżej:

Kopiuj
Application.Initialize;
Application.MainFormOnTaskbar := True; //tego zapewne brakuje
Application.Title := 'Moja';
Application.CreateForm(...);
Application.Run;
 
Zobacz pozostałe 3 komentarze
MA
Na jakim Delphi działa? Rejestrowałeś komunikat funkcją RegisterWindowMessage? Chętnie zobaczę przykładowy działający kod.
MA
Potwierdzam ,że twoj kod działa, bez względu na ustawienie MainFormOnTaskBar. A oto mój warunkowo działający kod: http://4programmers.net/Pastebin/2502 . Myślę, że kluczem do działania jest zastosowanie przez ciebie przechwytywania komunikatów przez użycie zdarzenia Application.OnMessage. Ja zrobiłem to inaczej, więc trzeba by porównać, co ma wpływ, że działanie mojej metody jest uzależnione od wspomnianego ustawienia.
MA
Już skumałem, gdzie jest źle: W wierszu OldWindowProc := Pointer(SetWindowLong(Handle, GWL_WNDPROC, LongInt(@NewWindowProc))) zamiast samego Handle powinno być Application.Handle.
KA
Tylko po co bawić się w "ręczny" subclasing i klepanie kodu w WinApi jak można to było zrobić jak ja to zrobiłem i na jedno wychodzi.
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około godziny
  • Lokalizacja:Gorlice
0

@marogo No tak masz rację jednak ma do tego ale jest dokładnie odwrotnie ma być:

Kopiuj
Application.MainFormOnTaskbar := False;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
MA
Skoro tak twierdzisz, to widocznie ma być odwrotnie, aby zadziałał kod pytacza (nie sprawdzałem). W każdym razie w moim przypadku pomogło ustawienie na true, stąd moja sugestia, że to może mieć wpływ, bo to podobne problemy.
KA
W przypadku komunikatu tak czy tak można odebrać nie wiem dlaczego nie mogłeś odebrać :/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.