Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Embedding HWND into external process using SetParent

Tags:

c

winapi

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 that I'm hoping someone can help me out with. 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

Does anybody know a workaround for this? I would like my window to be treated as just another child window of the main application.

like image 679
flashk Avatar asked Oct 04 '08 18:10

flashk


2 Answers

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.

like image 159
flashk Avatar answered Nov 01 '22 05:11

flashk


I am not sure if you are still interested in this topic after almost three years. I am working on a similar application. My solution is to modify the window style before you call SetParent. With this solution, I don't have to call AttachThreadInput.

However, one major issue of hosting child windows from an external process is that if the external process hangs while responding to a user keyboard or mouse input, the main application also freezes. The message loop in the main application is still running. However, it no longer receives user input events. Therefore, it appears as if it is hanging. I believe that's the direct result of AttachThreadInput since the input events of the two threades are now synchronized. If one of them is blocked, both are blocked.

like image 4
Stephen Avatar answered Nov 01 '22 05:11

Stephen