FindWindow - nie znajduje okna w XE5

0

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

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

Teraz tworze nowy program w którym ustawiam.

Application.Title := 'Moja';

Jak go kompiluje w D7 to

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

1

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

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.

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.

0

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

Application.Initialize;
Application.MainFormOnTaskbar := True; //tego zapewne brakuje
Application.Title := 'Moja';
Application.CreateForm(...);
Application.Run;
 
0

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

Application.MainFormOnTaskbar := False;

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