![]() |
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. |
Re: Findwindow Handle immer Null
Hallo, eine mögliche Fehlerquelle: Das TMenuItem enthält ein "&" - Zeichen, welches zuvor entfernt werden muss.
|
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 |
Re: Findwindow Handle immer Null
Danke. Der Tip mit tmenuitem(sender).tag hat funktioniert.
|
Re: Findwindow Handle immer Null
wofür machst du das hier:
Delphi-Quellcode:
Ist die Anwendung zu schnell und du willst das sie etwas verlangsamen? :gruebel:
(IntToStr(Wnd) <> '' )
|
Re: Findwindow Handle immer Null
Zitat:
Delphi-Quellcode:
oder
IntToStr(Wnd) <> '0'
Delphi-Quellcode:
heißen, um zu funktionieren? :P
Char(Wnd) <> ''
MAn könnte natürlich auch einfach gleich
Delphi-Quellcode:
schreiben... :wink:
Wnd <> 0
[Edit]Vergesst es, sorry hier geht grad die Welt unter, Hagel und so... |
Re: Findwindow Handle immer Null
Delphi-Quellcode:
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 :-)
IntToStr(Wnd) <> '0'
Delphi-Quellcode:
Wnd <> 0
Delphi-Quellcode:
Das würde immer True ergeben weil ein Zeichen niemals gleichzeitig kein Zeichen sein kann ;-)
Char(Wnd) <> ''
|
Re: Findwindow Handle immer Null
Zitat:
|
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