Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 5985
  • Last Modified:

Get Window Name from the Handle.

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
DMTrump
Asked:
DMTrump
  • 7
  • 3
  • 3
  • +4
6 Solutions
 
DMTrumpAuthor Commented:
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
 
DMTrumpAuthor Commented:
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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
JohnjcesCommented:
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
 
JohnjcesCommented:
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
 
mystamiCommented:
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
 
mystamiCommented:
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
 
mystamiCommented:
AND LOL I just realised I'm in the wrong forum I thought I was in the Visual Basic forum. LMAO sorry!!!!!
0
 
DMTrumpAuthor Commented:
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
 
JohnjcesCommented:
Gotcha! You still might check out the code on my ftp as it might help you.

Good luck!

John  -
0
 
ThievingSixCommented:
I'm tired as all hell but wouldn't GetWindowText work?

You want the window caption from the hWnd no?
0
 
DMTrumpAuthor Commented:
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
 
rionrocCommented:
Hello

How is it?, did you get what you want?
0
 
rionrocCommented:
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
 
DMTrumpAuthor Commented:
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
 
ZozzeCommented:
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
 
DMTrumpAuthor Commented:
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
 
ThievingSixCommented:
Ok, could you use the classnames section of FindWindow/FindWindowEx instead of the name itself?

GetClassName() might help you.
0
 
DMTrumpAuthor Commented:
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

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

  • 7
  • 3
  • 3
  • +4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now