Solved

Get Window Name from the Handle.

Posted on 2009-05-09
19
5,540 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
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 
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
 
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

What is SQL Server and how does it work?

The purpose of this paper is to provide you background on SQL Server. It’s your self-study guide for learning fundamentals. It includes both the history of SQL and its technical basics. Concepts and definitions will form the solid foundation of your future DBA expertise.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
This Micro Tutorial demonstrates using Microsoft Excel pivot tables, how to reverse engineer competitors' marketing strategies through backlinks.
Windows 10 is mostly good. However the one thing that annoys me is how many clicks you have to do to dial a VPN connection. You have to go to settings from the start menu, (2 clicks), Network and Internet (1 click), Click VPN (another click) then fi…

773 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