Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Window-Handel rausfinden, was mach ich falsch? (https://www.delphipraxis.net/13933-window-handel-rausfinden-mach-ich-falsch.html)

burning 29. Dez 2003 13:43


Window-Handel rausfinden, was mach ich falsch?
 
Hi,
Habe bisher nur ein bisschen mit Delphi rumgespielt, aber jetzt wollte ich mal wieder richtig anfangen.
Mein Ziel ist es, das Handle eines Fensters herauszubekommen ("Delphi"). Durch rumspielen hab ich kein brauchbares Ergebnis erzielt, also hab ich den Code von http://www.tipps.delphi-source.de/sy...001003-1.shtml einfach in mein eigenes Programm kopiert (ja es ist noch richtig schön mit TFORM1 etc. :mrgreen: ), das sieht wie folgt aus, liefert aber immer das Ergebnis, dass kein Fenster gefunden werden kann, egal ob ich 'Delphi" angebe, oder '', oder sonst einen Namen eines Fensters. Woran liegts?
Ich wäre für jegliche Hilfe echt dankbar. :drunken:

--- Programm ---


Delphi-Quellcode:
unit Unit1;

interface

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

type


  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  PFindWindowStruct = ^TFindWindowStruct;
  TFindWindowStruct = record
    Caption: string;
    ClassName: String;
    WindowHandle: THandle;
end;

function EnumWindowsProc(hWindow: hWnd; lParam: LongInt): boolean; stdcall;
var lpBuffer: PChar;
    WindowCaptionFound: boolean;
    ClassNameFound: boolean;
begin
  GetMem(lpBuffer, 255);
  result:=true;
  WindowCaptionFound:=false;
  ClassNameFound:=false;
  try
    if GetWindowText(hWindow, lpBuffer,255)>0 then
      if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer))>0
      then WindowCaptionFound:=true;
    if PFindWindowStruct(lParam).ClassName='' then
      ClassNameFound:=true
      else if GetClassName(hWindow, lpBuffer, 255)>0 then
        if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer))>0
        then ClassNameFound:=true;
    if (WindowCaptionFound and ClassNameFound) then begin
      PFindWindowStruct(lParam).WindowHandle:=hWindow;
      result:=false;
    end;
  finally
    FreeMem(lpBuffer, sizeof(lpBuffer^));
  end;
end;

function FindAWindow(caption: string; ClassName: string): THandle;
var WindowInfo: TFindWindowStruct;
begin
  with WindowInfo do begin
    caption:=caption;
    className:=ClassName;
    WindowHandle:=0;
    EnumWindows(@EnumWindowsProc,LongInt(@WindowInfo));
    result:=WindowHandle;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var TheWindowHandle: THandle;
begin
  TheWindowHandle:=FindAWindow('Delphi', '');
  if TheWindowHandle=0 then
    ShowMessage('Window not found!')
  else
    BringWindowToTop(TheWindowHandle);
end;

end.
[edit=sakura] [delphi]-Tags gesetzt. Mfg, sakura[/edit]

fkerber 29. Dez 2003 13:52

Re: Window-Handel rausfinden, was mach ich falsch?
 
Hi!

Ich mach das so:

Delphi-Quellcode:
function EnumWindowsProc(const hWnd : Longword; Param: lParam): LongBool; stdcall;
var
  Buffer: array[0..1024] of Char;
begin
  Result := True;
  GetWindowText(hWnd, Buffer, sizeof(Buffer));
  if lstrlen(Buffer) = 0 then
   begin
    exit;
   end
  else
   begin
    Form1.listbox1.items.Add (buffer);
   end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
LPARRAM : DWord;

begin
EnumWindows (@EnumWindowsProc,Integer(@LPARRAM));
end;


procedure TForm1.Button2Click(Sender: TObject);
var
hHandle: THandle;
i: integer;
begin
for i:=0 to Listbox1.Items.count-1 do begin
hHandle := FindWindow(nil, PChar(Listbox1.Items[i]));
//[...] für jedes Elemnt der LB ein Handle, das ich dann hier verwende
end;
end;
Ciao fkerber

burning 29. Dez 2003 14:04

Re: Window-Handel rausfinden, was mach ich falsch?
 
THX!
Button 1 liefert mir nun ja eine nette Auflistung aller Prozess-Namen (oda?), das geht einwandfrei, aber Button 2 hat bei mir dann keinen Effekt...selbst wenn ich dort sowas wie

qwerHandle := FindWindow(nil,'Delphi');
BringWindowToTop(qwerHandle);

ergänze.

burning 29. Dez 2003 15:44

Re: Window-Handel rausfinden, was mach ich falsch?
 
des kann doch ned so schwer sein :wall: was zum teufel mach ich eigentlich falsch...
ich hoffe immernoch auf jemanden, der mir einen vollständigen code liefern kann, mit dem ich das handle eines fensters mit dem namen "xy*"herausbekommen kann...bitte... :gruebel: :roll: :cry:

fkerber 29. Dez 2003 15:52

Re: Window-Handel rausfinden, was mach ich falsch?
 
Hi!

Als Ergänzung (an der Stelle [...] (es wird noch eine Variable str: string definiert):

Delphi-Quellcode:
str:=gettext(hhandle);
if pos('Windows Media Player', str)<> 0 then begin ...
In dem Moment wo die If-Bedingung zutrifft, steht das Handle auf das den MediaPlayer.
Anstelle von Windows Media Player setzt du das ein, was in der Liste steht!


Ciao fkerber

[Edit]
Da fehlt noch die Funktion GetText:
Delphi-Quellcode:
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);
// Änderung ->
    if Assigned(Text) then
    try
      SendMessage(Wnd, WM_GETTEXT, textlength + 1, Integer(Text));
//      Result := Text;
// Änderung ->
    SetString(Result, Text, lstrlen(Text));
    finally
      FreeMem(Text);
    end;
  end;
end;
[/Edit]
Ciao fkerber

burning 29. Dez 2003 16:29

Re: Window-Handel rausfinden, was mach ich falsch?
 
Zitat:

Zitat von fkerber
Hi!

Anstelle von Windows Media Player setzt du das ein, was in der Liste steht!

Ciao fkerber

Wohl eher den Namen des Programms von dem ich den Handle will, oda? :?:

fkerber 29. Dez 2003 16:59

Re: Window-Handel rausfinden, was mach ich falsch?
 
Hi!

Eija, aber du kannst in der ListBox gucken, wie das Fenster genau heißt. z.B. bei Delphi heißt das Fenster ja Delphi7 in der Titelzeile steht aber immer noch das Projekt hintendran, so meinte ich das. Nicht alle Fenster heißen so, wie es in der Titelleiste steht, deswegen, da mal nachschauen!

Ciao fkerber

p.S. gehts ansonsten?

burning 29. Dez 2003 17:06

Re: Window-Handel rausfinden, was mach ich falsch?
 
Danke, ich denke ich werde später nochmal alles von Grund auf durchgehen und schauen, obs dann geht. Im Moment bekomm ich meinen PC noch ned dazu bewegt, das Fenster nach vorne zu holen, welches ich will... :oops:

/EDIT:
Es geht :bounce1: :dancer:

Vielen Dank!
Nun werd ich mal noch ein bisschen rumspielen und noch ein paar Sachen testen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 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