Solved

Get Window Name from the Handle.

Posted on 2009-05-09
19
5,435 Views
Last Modified: 2012-05-06
If I have the Handle of a Window, how can I get the name of that window

Seems like their ought to be a function called GetWindowName(Hwnd);  But I can't find it if there is.
0
Comment
Question by:DMTrump
  • 7
  • 3
  • 3
  • +4
19 Comments
 
LVL 19

Assisted Solution

by:elimesika
elimesika earned 50 total points
ID: 24345742
0
 

Author Comment

by:DMTrump
ID: 24345788
I had looked at both of those (I've been searching for hours) and neither seem to be what I need  (but I could be just confused)

The It seems as though what I need is the reverse of FindWindowEx because I need not the Title of a window from a PID, not just the class name of the window but the NAME of a particular instance of a window (an edit control, for instance)  
0
 

Author Comment

by:DMTrump
ID: 24345800
To clarify further, I need to be able to point to a widndow and get its handle with WindowFromPoint which returns a handle, get the instance name of that window then climb the hierarchy using GetParent and get the names off each parent so that I can use them in a function like the one below that drill down into IE6 to get the current URL.

  Result := '';
  if handle = 0 then
    handle := FindWindow(pchar('IEFrame'), nil);
  if handle <> 0 then begin
    handle := FindWindowEx(handle, 0, 'WorkerW', nil);
    if handle <> 0 then begin
      handle := FindWindowEx(handle, 0, 'rebarwindow32', nil);
      if handle <> 0 then begin
        handle := FindWindowEx(handle, 0, 'comboboxex32', nil);
        if handle <> 0 then begin
          handle := FindWindowEx(handle, 0, 'ComboBox', nil);
          if handle <> 0 then begin
            handle := FindWindowEx(handle, 0, 'Edit', nil);
            if handle <> 0 then begin
              SendMessage(handle, WM_GETTEXT, 512, longint(@buf));
              Result := string(buf);
            end;
          end;
        end;
      end;
    end;
  end;
end;
0
 
LVL 18

Accepted Solution

by:
Johnjces earned 100 total points
ID: 24346684
If all you want/need is the current URL in I.E. 6 why not use a function to do just that? It would sure be simpler.

Anyway, if that is all you need, try the code below. It works in/on and the browser types you enter

Firefox
IExplore
Netscape
Mosaic
Netscp6
Mozilla

So,

MyURL := GetURL('IExplore');

Maybe this will work for you... maybe not!

John


uses

  ddeman;

 

function GetURL(Browser: string): string;

var

 Client_DDE: TDDEClientConv;

 temp: PChar;

begin

 Result := '';

 Client_DDE:= TDDEClientConv.Create( nil );

 with Client_DDE do

  begin

   SetLink(Browser, 'WWW_GetWindowInfo');

   temp := RequestData('0xFFFFFFFF');

   Result := StrPas(temp);

  // Return only the URL part

   Delete(Result, Pos(',', Result), Length(Result)-Pos(',', Result)+1);

   // Remove quotes

   Delete(Result, 1, 1);

   Delete(Result, Length(Result), 1);

   // ************

   StrDispose(temp);

   CloseLink;

  end;

 Client_DDE.Free;

end;

Open in new window

0
 
LVL 18

Expert Comment

by:Johnjces
ID: 24346699
Lastly, if you still want to find the text in a specific edit control in some app, I keep some code on my ftp site that could help you.

Check out

ftp://jcitssystems.com/pub/DelphiExamples/WinHandles.zip

May take a minute to connect so be patient.

John
0
 
LVL 1

Expert Comment

by:mystami
ID: 24346719
If you are talking about the Text of the window for example this windows text is:

Get Window Name from the Handle. : Windows API - Window Internet Explorer

Then you do it like this, tested here and it works.
Dim lngHandle as Long

lngHandle = 1771640 'Of course you will change this to the handle that you have.

Dim TheText As String, TL As Long

TL = SendMessageLong(lngHandle, WM_GETTEXTLENGTH, 0&, 0&)

TheText = String(TL + 1, " ")

Call SendMessageByString(ieframe, WM_GETTEXT, TL + 1, TheText)

TheText = Left(TheText, TL)

MsgBox TheText

Open in new window

0
 
LVL 1

Assisted Solution

by:mystami
mystami earned 100 total points
ID: 24346721
oops sorry I typoed in that one. forgot to change the ieframe to lngHandle
Dim lngHandle as Long

lngHandle = 1771640 'Of course you will change this to the handle that you have.

Dim TheText As String, TL As Long

TL = SendMessageLong(lngHandle, WM_GETTEXTLENGTH, 0&, 0&)

TheText = String(TL + 1, " ")

Call SendMessageByString(lngHandle, WM_GETTEXT, TL + 1, TheText)

TheText = Left(TheText, TL)

MsgBox TheText

Open in new window

0
 
LVL 1

Expert Comment

by:mystami
ID: 24346723
AND LOL I just realised I'm in the wrong forum I thought I was in the Visual Basic forum. LMAO sorry!!!!!
0
 

Author Comment

by:DMTrump
ID: 24346772
Johnjces,  Sorry I confused you - no the code I quoted was just an example of why I need this function.  But thanks for the code anyway - it may prove useful to myself or someone else.

No - it was just to show how I will use the results - that is to create a descending "ladder" to a specific window in any application (not in browsers)

No I don't need the displayed text of an edit control - I need to get the control NAME, so that I can use FindWindowEx to get to a specific control in another application.  I thought there would be an API function that would let me get the name of a control (NOT user viewable text , but the Window NAME - the value you need to pass to the FindWindowEx API function.  

mystami:m  No harm!  

0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 18

Expert Comment

by:Johnjces
ID: 24346912
Gotcha! You still might check out the code on my ftp as it might help you.

Good luck!

John  -
0
 
LVL 13

Expert Comment

by:ThievingSix
ID: 24347084
I'm tired as all hell but wouldn't GetWindowText work?

You want the window caption from the hWnd no?
0
 

Author Comment

by:DMTrump
ID: 24349133
No - GetWindowText returns the displayable contents of a Window - in the case of a main window (a form) it will return the caption.  In the case of a control that has displayable text such as an edit control or a label control (the Delph terms) it will return the caption of the label or the text in the edit box.  No, what I need is the "name" of the object.  That is the value that is needed for passing to the API method FindWindowsEx.  Thinking in Delphi terms, the value that I'm looking for is the value that you supply (or automatically allow) in the "Name" property NOT the one in the "caption" or "text" property.
0
 
LVL 12

Expert Comment

by:rionroc
ID: 24349375
Hello

How is it?, did you get what you want?
0
 
LVL 12

Assisted Solution

by:rionroc
rionroc earned 100 total points
ID: 24349394
from:
http://www.swissdelphicenter.ch/torry/showcode.php?id=410

I hope that can help you!

//begin
unit Unit1;

interface

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

type
  PWindows = ^TWindows;
  TWindows = record
    WindowHandle: HWND;
    WindowText: string;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    TreeView1: TTreeView;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  PMyEnumParam = ^TMyEnumParam;
  TMyEnumParam = record
    Nodes: TTreeNodes;
    Current: TTreeNode;
  end;

var
  Form1: TForm1;
  PNode, CNode: TTreeNode;
  AWindows: PWindows;

implementation

{$R *.DFM}



function EnumWindowsProc(Wnd: HWND; Param: PMyEnumParam): BOOL; stdcall;
const
  MyMaxName = 64;
  MyMaxText = 64;
var
  ParamChild: TMyEnumParam;
  ClassName: string;
  WindowText: string;
begin
  Result := True;
  SetLength(ClassName, MyMaxName);
  SetLength(ClassName, GetClassName(Wnd, PChar(ClassName), MyMaxName));
  SetLength(WindowText, MyMaxText);
  SetLength(WindowText, SendMessage(Wnd, WM_GETTEXT, MyMaxText, lParam(PChar(WindowText))));
  ParamChild.Nodes   := Param.Nodes;
  ParamChild.Current := Param.Nodes.AddChildObject(Param.Current,
    '[' + ClassName + '] "' + WindowText + '"' + ' Handle: ' + IntToStr(Wnd), Pointer(Wnd));
  EnumChildWindows(Wnd, @EnumWindowsProc, lParam(@ParamChild));
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  Param: TMyEnumParam;
begin
  Param.Nodes := TreeView1.Items;
  Param.Current := TreeView1.TopItem;
  TreeView1.Items.BeginUpdate;
  EnumWindows(@EnumWindowsProc, lParam(@Param));
  TreeView1.Items.EndUpdate;
end;

end.
//end

Cheers!
0
 

Author Comment

by:DMTrump
ID: 24357569
It seems as though the API function  GetWindowText is the only one that returns the name of a window control - however - if the control is one like an edit control that can contain displayable text that is what is returned instead of the object name.  Since that seems to be the case, I can't use it in the way I need to.  Therefore, this  question appears not to have a complete answer.

I will leave it open for a while, in case someone has a better conclusion to the problem and if none is forthcoming, will divide the points up among everyone who has been helpful.

I jsut have to face it - sometimes the answer is "no".

Moderator, please do not consider this abandoned - I will continue to monitor it and close it myself.
0
 

Assisted Solution

by:Zozze
Zozze earned 50 total points
ID: 24380246
If you mean that you need to get the variable name of a handle, then I don't think that is possible. correct me if I' m wrong
0
 

Author Comment

by:DMTrump
ID: 24381231
Take a look at the code in post number 3 where I start "To clarify further' and tell me what is going on there.  I agree with you, I did not think that variable names "survived" compilation and assembly, but the object windows in that hierarchy are identified by name - and the code works.  So how is that possible?

In any case, I've gone a different direction to solve my requirement, and although I'll leave this question open for a few more days, "just in case", I'm no longer in "deperate" need of a solution <BG>
0
 
LVL 13

Assisted Solution

by:ThievingSix
ThievingSix earned 100 total points
ID: 24381256
Ok, could you use the classnames section of FindWindow/FindWindowEx instead of the name itself?

GetClassName() might help you.
0
 

Author Closing Comment

by:DMTrump
ID: 31579828
OK!  I just looked again at the code I posted showing the descending hierarchy through IE6 to the URL - It IS following the classname - not the object name s I thought.  So everyone who kept suggesting using the classname was in fact correct - however a lot of other good code was posted, so essentially I'm giving points to everyone who worked on this.
This is an embarassing leson in careless assumptions on my part.  Thanks to everyone who chipped in!
0

Featured Post

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now