none
How do I set an umanaged dialog as the Owner of a WinForm Form?

    Question

  • I need to be able to set a WinForm dialog's Owner's HWND. In unmanaged I have a background thread that gets the HWND for the window in front. The code then calls ::GetParent(frontHWND) to see if it needs to hide a different non-modal MFC dialog. When the WinForm dialog is the frontHWND, I always get NULL back for the GetParent call. I have also tried GetOwner realizing .Net tried to cleanup the difference between Parent and Owner. Looking at the WinForm dialog w/ Spy++, it also say the WinForm has no parent or owner. I have passed in NativeWindow ^natWin = gcnew NativeWindow(); natWin->AssignHandle(IntPtr(hwndParent)); managedDlg->ShowDialog(natWin); The above code didn't set the owner of the WinForm. I tried calling the Win32 SetParent from the WinForm code in OnFormShown(), but the locked up the MFC application and the WinForm. Can someone explain how to get my unmanaged dialog/app to be the owner/parent of the managed winform?
    Wednesday, April 20, 2011 6:48 PM

Answers

  • Hi byronasdf,

    I think the GetWindow Function is what you want.

    GetWindow Function

    Retrieves a handle to a window that has the specified relationship (Z-Order or owner) to the specified window.

    The following is my test code, so you can reference it:

     

     [DllImport("user32.dll", SetLastError = true)]
     static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
    
     enum GetWindow_Cmd : uint
     {
      GW_HWNDFIRST = 0,
      GW_HWNDLAST = 1,
      GW_HWNDNEXT = 2,
      GW_HWNDPREV = 3,
      GW_OWNER = 4,
      GW_CHILD = 5,
      GW_ENABLEDPOPUP = 6
     }
    
     private void button2_Click(object sender, EventArgs e)
     {
      this.label3.Text = GetWindow(this.Handle, GetWindow_Cmd.GW_OWNER).ToString("x");
     }
    

    Since I'm not familiar with C++ syntax, so I use the C# code test this function, you just need to use the same function in your C++ project.

    And in the native code, you just need to use the SetParent function to set the managed Form as a child to the native window.

    If there's any concern, please feel free to let me know.

    Have a nice day!


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.



    Thursday, April 21, 2011 9:15 AM
    Moderator
  • Hi byronasdf,

    Owner is the *Window responsible for a control or dialog (for example, responsible for creating/destroying the window).

    Parent is the next-senior window* to a control or dialog in the window chain, but isn't actually responsible for it (doesn't necessarily care about its lifecycle, etc). A window's parent can also be its owner.

    *Window vs window: Window is an actual window displayed on the screen; window is any object with a HWND (includes buttons, panels, etc).

     

    GetOwner gets the owner of a non-child window

    GetParent gets the parent of a child window window

     

    Best wishes,


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Thursday, April 28, 2011 5:09 AM
    Moderator

All replies

  • The Form will have a Handle property which will give you the HWND of the form window.
    http://blog.voidnish.com
    Wednesday, April 20, 2011 6:52 PM
    Moderator
  • I can get the Form's handle. I can't get the form's owner's/parent's handle, b/c when calling the Win32 call GetParent(formHwnd), it returns NULL. Also, Spy++ says the Form's Parent/Owner is NULL.
    Wednesday, April 20, 2011 7:11 PM
  • I can get the Form's handle. I can't get the form's owner's/parent's handle, b/c when calling the Win32 call GetParent(formHwnd), it returns NULL. Also, Spy++ says the Form's Parent/Owner is NULL.

    Yeah, so what's wrong with that? That probably means the form is a top level window.
    http://blog.voidnish.com
    Wednesday, April 20, 2011 7:34 PM
    Moderator
  • I open the Form by calling NativeWindow ^natWin = gcnew NativeWindow(); natWin->AssignHandle(IntPtr(hwndParent)); managedDlg->ShowDialog(natWin); Therefore, I'm expecting the call to ::GetParent(formHwnd) to return me the HWND that I passed in when I opened the Form with ShowDialog(natWin) earlier. BTW, thanks for the help.
    Wednesday, April 20, 2011 7:42 PM
  • Apparently, that alone does not do what you think it will. You may also need to explicitly set the Parent property.
    http://blog.voidnish.com
    Wednesday, April 20, 2011 8:13 PM
    Moderator
  • Hi byronasdf,

    I think the GetWindow Function is what you want.

    GetWindow Function

    Retrieves a handle to a window that has the specified relationship (Z-Order or owner) to the specified window.

    The following is my test code, so you can reference it:

     

     [DllImport("user32.dll", SetLastError = true)]
     static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
    
     enum GetWindow_Cmd : uint
     {
      GW_HWNDFIRST = 0,
      GW_HWNDLAST = 1,
      GW_HWNDNEXT = 2,
      GW_HWNDPREV = 3,
      GW_OWNER = 4,
      GW_CHILD = 5,
      GW_ENABLEDPOPUP = 6
     }
    
     private void button2_Click(object sender, EventArgs e)
     {
      this.label3.Text = GetWindow(this.Handle, GetWindow_Cmd.GW_OWNER).ToString("x");
     }
    

    Since I'm not familiar with C++ syntax, so I use the C# code test this function, you just need to use the same function in your C++ project.

    And in the native code, you just need to use the SetParent function to set the managed Form as a child to the native window.

    If there's any concern, please feel free to let me know.

    Have a nice day!


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.



    Thursday, April 21, 2011 9:15 AM
    Moderator
  • Hi byronasdf,
    I am writing to check the status of the issue on your side. 
    What about this problem now? 
    Would you mind letting us know the result of the suggestions?
    Best wishes,

    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Tuesday, April 26, 2011 6:16 AM
    Moderator
  • Sorry for the delay. Calling GetWindow(managedHwnd, GW_OWNER) returns the HWND that I wrap then pass into managedDlg->ShowDialog(WrappedNatWindow). It will also return the HWND of my app if I don't pass anything into ShowDialog(). I haven't had time to go back and test the GetParent(), GetOwner() and understand better why the GetOwner didn't return the HWND I was expecting. I also want to test calling the Win32 SetParent(mngdHwnd, UnmngdHwnd) and see why it was causing my dialog and app to lock up. I'll try to repost back here if I ever make time to retest. Thanks for the help.
    Tuesday, April 26, 2011 7:53 PM
  • Hi byronasdf,

    Owner is the *Window responsible for a control or dialog (for example, responsible for creating/destroying the window).

    Parent is the next-senior window* to a control or dialog in the window chain, but isn't actually responsible for it (doesn't necessarily care about its lifecycle, etc). A window's parent can also be its owner.

    *Window vs window: Window is an actual window displayed on the screen; window is any object with a HWND (includes buttons, panels, etc).

     

    GetOwner gets the owner of a non-child window

    GetParent gets the parent of a child window window

     

    Best wishes,


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Thursday, April 28, 2011 5:09 AM
    Moderator