【发布时间】:2013-12-25 16:24:16
【问题描述】:
我的目标是从另一个进程停靠浏览器窗口 进入我的应用程序。
我有一个面板 hwnd 将作为父级,以及浏览器窗口的 hwnd。
这是一个代码:
ShowWindow(browserPtr, 3);
SetParent(browserPtr, browserContainerPanel.Handle);
MoveWindow(browserPtr, 0, 0, browserContainerPanel.Width, browserContainerPanel.Height, true);
在这种情况下,浏览器窗口变成了一个子窗口,并正确放置。 但它停止接受键盘输入并且无法聚集焦点。
如果我不调用 ShowWindow - 除了窗口位置和大小之外,一切都正常工作。 没有 ShowWindow 我无法设置大小和位置。 MoveWindow 只是被忽略了。
为什么停靠窗口不接受用户输入? 我做错了什么?
更新
当前我的代码:
/// Attach container app input thread to the running app input thread, so that
/// the running app receives user input.
FAppThreadID = GetWindowThreadProcessId(window, new IntPtr());
AttachThreadInput(GetCurrentThreadId(), FAppThreadID, true);
/// Changing parent of the running app to our provided container control
SetParent(window, container);
SendMessage(container, WM_UPDATEUISTATE, UIS_INITIALIZE, 0);
UpdateWindow(window);
/// Make the running app to fill all the client area of the container
SetWindowPos(window, 0, 0, 0, 1000, 1000, SWP_NOZORDER);
SetForegroundWindow(window);
但在这种情况下,由于某种原因,窗口大小被忽略了。但是,焦点和输入一切正常。如何固定尺寸?
【问题讨论】:
-
什么是 3?你为什么不使用
SW_常量? -
我在 .net 下使用它,但我不知道那里有任何这样的常量。 3 是 SW_SHOWMAXIMIZED 和 SW_MAXIMIZE 常量的值。所以这里没有任何区别。
-
父窗口和子窗口需要有某种方式来管理输入。您需要在浏览器窗口上使用适当的托管界面,但由于您没有说明您使用的是什么浏览器,所以没有什么可以说的。
-
它是一个mozilla浏览器组件。
-
这实际上是不可能实现的。你有两个进程,两个输入线程,你试图让它看起来像一个应用程序。寻找不同的解决方案。您将无法完成这项工作。