Window handle

How do you retrieve the handle of the main window in an SDI application?  I need the HWND value for various procedures, but not sure if I have it correctly.  Example prefered.

Thanks
jermAsked:
Who is Participating?
 
HoJuConnect With a Mentor Commented:
It's all going to depend on where you're trying to get the handle from ...

If you're getting it from within your main callback -- probably called WndProc -- then it should be your hwnd parameter.

If you're getting it from within other callbacks that have the main window as a parent window or an owner window, you can use:

hwndMain = (HWND) GetWindowLong(hwnd, GWL_HWNDPARENT);
or
hwndMain = (HWND) GetWindow(hwnd, GWL_OWNER);

... where hwnd is the handle of the window whose callback you're inside of.

Any other functions can be passed hwnd as a parameter, or you can simply have hwnd be a static HWND when you declare it in the first place, so you can access it from anywhere.

Hope that answers your question.
0
 
jtwine100697Commented:
  Assuming you are using MFC, try AfxGetMainWnd().  That will return a CWnd*, from which you can obtain the HWND.

-=- James.
0
 
vsinhaCommented:
I think a simpler solution would be:

hwndMain = (HWND) GetWindow(hwnd, GWL_OWNER);

I am however not an expert (currently) in this topic, so try it and correct me if I am wrong.
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
vsinhaCommented:
sorry about the previous comment, it should have been:

I think a simpler solution would be:

hwndMain = GetParent(hwnd);

I am however not an expert (currently) in this topic, so try it and correct me if I am wrong.
0
 
jtwine100697Commented:
  "vsinha", you are assuming that the immediate parent will be the main window...

   That is not always the case. :P

-=- James.
0
 
vsinhaCommented:
Jtwine, I guess this is not my question, but it would be very helpful if you could give me an example where my soln. won't work and yours will. Also could you explain why?

0
 
jtwine100697Commented:
  If you are in, say, a dialog box, or in a custom control that is implemented in a window (or in the view of an MFC Doc/View MDI application), the parent of the "current" window might not be the "main window" of the application.  (Note the question reads "various procedures".  That could mean various windows.)

   You (We) need more details on the specifics of where "jerm" wants to obtain the main window from.  If using MFC, AfxGetMainWnd() works...  Anywhere.

-=- James.

0
 
vsinhaCommented:
jtwine, thanks. If you are not using MFC would this function work:

HWND GetMainWnd(HWND hwnd)
{
   while (GetParent(hwnd) != NULL)
      hwnd = GetParent(hwnd);
   
   return hwnd;
}

[written, based on the fact that the parent of the main window is NULL]

Also didn't HoJu`s soln. have the same drawback as mine.
0
 
jtwine100697Commented:
  Yes, the function (loop) will work as expected.  (That, BTW, is similar to how MFC delegates control [updates] for Context Menus!)

   And yes, the Answer posted by "Hoju" has the same problem.  That is why I try to contain myself and post suggestions before wasting time with possibly incorrect answers! :)

-=- James.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.