【问题标题】:Window do not accept key press after ShowWindow(browserPtr, 3)ShowWindow(browserPtr, 3) 后窗口不接受按键
【发布时间】: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浏览器组件。
  • 这实际上是不可能实现的。你有两个进程,两个输入线程,你试图让它看起来像一个应用程序。寻找不同的解决方案。您将无法完成这项工作。

标签: c# c++ .net winapi


【解决方案1】:

您还应该在浏览器窗口上调用 SetFocus 以向其发送用户输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多