Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Findwindow Handle immer Null (https://www.delphipraxis.net/117849-findwindow-handle-immer-null.html)

svko 26. Jul 2008 08:43


Findwindow Handle immer Null
 
Ich fülle ein Popupmenü zu Laufzeit mit Fenstertiteln,wenn ich auf einen Eintrag gehe,soll
das Fenster versteckt werden. An der Stelle "wnd := FindWindowByTitle(TMenuItem(Sender).Caption);" erhalte ich immer Null.

Danke für die Antworten.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, antTaskbarIcon, ComCtrls, Menus, StdCtrls;

type
  Tmanager = class(TForm)
    tb: TantTaskbarIcon;
    popup: TPopupMenu;
    beenden1: TMenuItem;
    N11: TMenuItem;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure tbClick(Sender: TObject);
    procedure beenden1Click(Sender: TObject);
    procedure popupPopup(Sender: TObject);
  private
    { Private-Deklarationen }
   procedure MenuItem_OnClick(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  manager: Tmanager;

implementation

{$R *.dfm}

function GetText(Wnd: HWND): string;

var
  textlength: Integer;
  Text: PChar;
begin
  textlength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
  if textlength = 0 then Result := ''
  else
  begin
    GetMem(Text, textlength + 1);
    SendMessage(Wnd, WM_GETTEXT, textlength + 1, Integer(Text));
    Result := Text;
    FreeMem(Text);
  end;
end;



function EnumWindowsProc(Wnd: HWND; lParam: lParam): BOOL; stdcall;
var
i:integer;
amenuitem:tmenuitem;
begin
  Result := True;
  if (IsWindowVisible(Wnd) or IsIconic(wnd)) and
    ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
    (GetWindowLong(Wnd, GWL_HWNDPARENT) = GetDesktopWindow)) and
    (GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) and (IntToStr(Wnd) <> '' )then
     begin

     AMenuItem := TMenuItem.Create(manager.popup);
AMenuItem.Tag := i;
AMenuItem.Caption := GetText(Wnd);
AMenuItem.OnClick := manager.MenuItem_OnClick;
manager.popup.Items.Insert(0,AMenuItem);
     end;
end;

procedure Tmanager.FormCreate(Sender: TObject);
begin
tb.visible:=true;
end;

procedure Tmanager.tbClick(Sender: TObject);
begin
manager.Show;
end;

procedure Tmanager.beenden1Click(Sender: TObject);
begin
close;
end;

 function FindWindowByTitle(WindowTitle: string): Hwnd;
var
  NextHandle: Hwnd;
  NextTitle: array[0..260] of char;
begin

  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do
  begin

    GetWindowText(NextHandle, NextTitle, 255);
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
    begin
      Result := NextHandle;
      Exit;
    end
    else
      // Get the next window
      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
  Result := 0;
end;

procedure Tmanager.MenuItem_OnClick(Sender: TObject);
var
  wnd : HWND;
begin

   label1.Caption:=(TMenuItem(Sender).Caption);
  wnd := FindWindowByTitle(TMenuItem(Sender).Caption);

ShowWindow(wnd, SW_HIDE);
end;

procedure Tmanager.popupPopup(Sender: TObject);
var
  Param: Longint;
begin
  EnumWindows(@EnumWindowsProc, Param);
end;

end.

toms 26. Jul 2008 09:01

Re: Findwindow Handle immer Null
 
Hallo, eine mögliche Fehlerquelle: Das TMenuItem enthält ein "&" - Zeichen, welches zuvor entfernt werden muss.

rollstuhlfahrer 26. Jul 2008 09:20

Re: Findwindow Handle immer Null
 
HI,

warum setzt du nicht den Fensterhandle in die Tag-Eigenschaft des TMenuItems? Das einfügen von i, welches sowieso 0 haben sollte fällt dann weg. Und beim Abfragen castest du den Sender nach TMenuItem und frägst den Tag ab. Schon hast du dein Handle.

Bernhard

svko 26. Jul 2008 10:20

Re: Findwindow Handle immer Null
 
Danke. Der Tip mit tmenuitem(sender).tag hat funktioniert.

SirThornberry 26. Jul 2008 10:48

Re: Findwindow Handle immer Null
 
wofür machst du das hier:
Delphi-Quellcode:
(IntToStr(Wnd) <> '' )
Ist die Anwendung zu schnell und du willst das sie etwas verlangsamen? :gruebel:

Cyf 26. Jul 2008 14:56

Re: Findwindow Handle immer Null
 
Zitat:

Zitat von SirThornberry
wofür machst du das hier:
Delphi-Quellcode:
(IntToStr(Wnd) <> '' )
Ist die Anwendung zu schnell und du willst das sie etwas verlangsamen? :gruebel:

Müsste das nur so am Rande nicht auch
Delphi-Quellcode:
IntToStr(Wnd) <> '0'
oder
Delphi-Quellcode:
Char(Wnd) <> ''
heißen, um zu funktionieren? :P

MAn könnte natürlich auch einfach gleich
Delphi-Quellcode:
Wnd <> 0
schreiben... :wink:

[Edit]Vergesst es, sorry hier geht grad die Welt unter, Hagel und so...

SirThornberry 26. Jul 2008 15:08

Re: Findwindow Handle immer Null
 
Delphi-Quellcode:
IntToStr(Wnd) <> '0'
würde man auch nur machen wenn man will das die Anwendung unnötig langsam werden soll denn das IntToStr ist überflüssig. Schließlich geht es ja auch ohne str wie selbst bemerkt :-)
Delphi-Quellcode:
Wnd <> 0
Delphi-Quellcode:
Char(Wnd) <> ''
Das würde immer True ergeben weil ein Zeichen niemals gleichzeitig kein Zeichen sein kann ;-)

Cyf 26. Jul 2008 16:49

Re: Findwindow Handle immer Null
 
Zitat:

Zitat von SirThornberry
Delphi-Quellcode:
Char(Wnd) <> ''
Das würde immer True ergeben weil ein Zeichen niemals gleichzeitig kein Zeichen sein kann ;-)

Stimmt, Überlegung war von wegen Stringende, aber es funktioniert nur mit einem Vergleich auf #0, aber warum nicht einfach die Zahl vergleichen. :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz