[Last Call] Learn how to a build a cloud-first strategyRegister Now

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

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
0
jerm
Asked:
jerm
  • 4
  • 4
1 Solution
 
jtwine100697Commented:
  Assuming you are using MFC, try AfxGetMainWnd().  That will return a CWnd*, from which you can obtain the HWND.

-=- James.
0
 
HoJuCommented:
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
 
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
Independent Software Vendors: 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!

 
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

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

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.

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