Possible Duplicate:
Embedding HWND into external process using SetParent
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:
WND 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 workarounds for these issues? I would like my window to be treated as just another child window of the main application.
Thanks.
When my window gains input focus, the main application window of the external process loses focus (i.e. title bar changes color).
You need to use AttachThreadInput
to attach your process's thread to the input queue of the host process. In addition to synchronizing message processing across all attached threads, this causes them to share focus, asynchronous key state, activation, and other input-related properties.
Keyboard shortcut commands of the main application do not work while my window has focus.
When your window has keyboard focus, the thread that owns your window receives all keyboard messages from the system. If you need the main window's UI thread to handle accelerators, you must somehow route keyboard input to that thread for preprocessing. How you do this depends largely on the UI technologies you are using for your applications and how you need accelerators to be processed.
Building a user interface that spans multiple threads in different processes is difficult and there are many pitfalls.
来源:https://stackoverflow.com/questions/11355730/various-issues-using-setparent-to-embed-window-into-external-process