AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Findwindow Handle immer Null

Ein Thema von svko · begonnen am 26. Jul 2008 · letzter Beitrag vom 26. Jul 2008
Antwort Antwort
svko

Registriert seit: 19. Mai 2008
5 Beiträge
 
#1

Findwindow Handle immer Null

  Alt 26. Jul 2008, 09:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Findwindow Handle immer Null

  Alt 26. Jul 2008, 10:01
Hallo, eine mögliche Fehlerquelle: Das TMenuItem enthält ein "&" - Zeichen, welches zuvor entfernt werden muss.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#3

Re: Findwindow Handle immer Null

  Alt 26. Jul 2008, 10:20
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
svko

Registriert seit: 19. Mai 2008
5 Beiträge
 
#4

Re: Findwindow Handle immer Null

  Alt 26. Jul 2008, 11:20
Danke. Der Tip mit tmenuitem(sender).tag hat funktioniert.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Findwindow Handle immer Null

  Alt 26. Jul 2008, 11:48
wofür machst du das hier:
(IntToStr(Wnd) <> '' ) Ist die Anwendung zu schnell und du willst das sie etwas verlangsamen?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#6

Re: Findwindow Handle immer Null

  Alt 26. Jul 2008, 15:56
Zitat von SirThornberry:
wofür machst du das hier:
(IntToStr(Wnd) <> '' ) Ist die Anwendung zu schnell und du willst das sie etwas verlangsamen?
Müsste das nur so am Rande nicht auch IntToStr(Wnd) <> '0' oder Char(Wnd) <> '' heißen, um zu funktionieren?

MAn könnte natürlich auch einfach gleich Wnd <> 0 schreiben...

[Edit]Vergesst es, sorry hier geht grad die Welt unter, Hagel und so...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Findwindow Handle immer Null

  Alt 26. Jul 2008, 16:08
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
Wnd <> 0 Char(Wnd) <> '' Das würde immer True ergeben weil ein Zeichen niemals gleichzeitig kein Zeichen sein kann
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#8

Re: Findwindow Handle immer Null

  Alt 26. Jul 2008, 17:49
Zitat von SirThornberry:
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz