tags:

views:

1771

answers:

2

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.

A: 

I found some info on this at Catch22.net using the WM_NACTIVE Message.

It's in the section Prevent window deactivation. Hope that helps.

Cory
+3  A: 

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.

flashk