I’m trying to embed a window from my process into the window of an external process using the SetParent function and have encountered a few problems. First off, here is an outline of what I am currently doing to embed my window into the application:
HWND myWindow; //Handle to my application window HWND externalWindow; //Handle to external application window SetParent(myWindow,externalWindow); //Remove WS_POPUP style and add WS_CHILD style DWORD style = GetWindowLong(myWindow,GWL_STYLE); style = style & ~(WS_POPUP); style = style | WS_CHILD; SetWindowLong(myWindow,GWL_STYLE,style);
This code works and my window appears in the other application, but introduces the following issues:
- When my window gains input focus, the main application window of the external process loses focus (i.e. title bar changes color)
- Keyboard shortcut commands of the main application do not work while my window has focus
Is there a workaround for this? I would like my window to be treated as just another child window of the main application.
Well, I finally found the answer to my question.
To fix the issue with the main app losing focus you need to use the AttachThreadInput function to attach the embedded window thread to the main app thread.
Also, one can use the TranslateAccelerator function in response to WM_KEYDOWN messages to ensure accelerator messages of the main app are triggered.