Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Get Window Name from the Handle.

Posted on 2009-05-09
19
5,597 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
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

 
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

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Machine not responding during CopyFile() 3 104
indy Tmemory stream non latin charcter issue 2 121
Virtuailstring tree compare node issue 14 125
Intraweb download file link ? 1 155
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

856 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