问题标签 [childwindow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1945 浏览

winapi - win32 SDK子窗口绘制(C/C++)

我正在使用 win32 Platform SDK(在 XP Pro 上)创建一个应用程序,该应用程序由一个主窗口和多个子窗口组成。

传递给 CreateWindow 的样式是WS_OVERLAPPEDWINDOW | WS_VISIBLE(对于主窗口)和WS_CHILDWINDOW | WS_VISIBLE子窗口。

我看到的错误是当另一个应用程序被拖到我的应用程序顶部时,底层窗口不会重绘。强制更新的一种简单(但笨拙)的方法是“摇晃”标题栏。

我猜我错过了一条 Windows 消息或没有正确调用 win32 函数。我的大部分代码直接来自 Petzold 的 95 本书。

如果重要的话,主窗口不需要绘制任何东西:子窗口处理所有显示任务。

0 投票
1 回答
734 浏览

windows - 获取子窗口的屏幕截图

如果我有一个窗口的句柄,当它们出现时如何截取任何新的子窗口?现在我的代码每 0.1 秒截取一个窗口窗体的屏幕截图。当我单击下拉列表框时,随后的屏幕截图不包括它。使用 spy++ 我可以看到创建了一个新的子窗口,但不确定如何确保它包含在我的屏幕截图中。有人有任何可能包含子窗口的代码吗?

提前致谢,

鲍勃

0 投票
2 回答
1174 浏览

windows - 如何获取应用程序的活动子窗口?

我有这个问题。我有一个特定应用程序主窗口的处理程序,我想模拟该应用程序上的按键...

我正在使用 sendMessage/postMessage api 调用来执行此操作。我不使用 .Net SendKeys 函数或 win32 api 的 keybd_event 的原因是它们在全局级别模拟按键。就我而言,我可能已将应用程序最小化,但仍希望模拟按键。

sendMessage 和 postMessage 的问题在于,您必须传递要按下键的确切子窗口的处理程序。例如,在记事本中,如果我将密钥发送到主窗口,没有任何反应,我必须将密钥发送到基本上由白色画布组成的子窗口,您可以在其中进行书写。

以 msPaint 为例,如果用户创建一个新文档,并在该绘图中打开一个文本框,并且我想在那里模拟按键,我必须获取主窗口的子窗口的子窗口才能使其工作。

所以我找到了一种似乎适用于所有情况的方法,基本上,我使用带有参数 GW_CHILD 的 getWindow 来获取具有最高 z 值的子窗口。然后我为子窗口再次执行此操作并继续执行此操作,直到某个 childWindow 没有更多 childWindows..

它似乎奏效了,我很高兴!

但是......我发现这不起作用的情况。火狐就是其中之一。Firefox 有 mainWindow,然后有一个与 mainWindow 几乎相同的 childWindow,然后它还有另一个 childWindow,即网站区域,即地址栏和菜单下方的区域。例如,如果我在 www.google.com 上,并且我想在焦点搜索框中模拟按键,它会起作用,因为获取子窗口的子窗口会给我正确的 childWindow。但是,例如,如果用户单击地址栏,getWindow 的工作方式不会发生任何变化。它最终仍然会得到地址栏下的子窗口,什么都不做,而不是模拟地址栏上的按键。

问题是我还没有找到获取某个应用程序的活动子窗口的方法。我只能使用GetWindow方法来获取某个窗口的子窗口,直到找到没有子窗口的子窗口。但是,正如您在 firefox 案例中看到的那样,活动窗口实际上是我最终得到的子窗口的父级。

我尝试过其他 api 调用,如 getTopWindow 但我没有运气..

任何人都可以对这个问题有所了解吗?谢谢!

0 投票
2 回答
3375 浏览

c# - 如何获取未聚焦的应用程序的活动 ChildWindow?

我需要将处理程序获取到正在运行的某个应用程序的子窗口。我有主窗口处理程序,但我需要知道哪个特定的子窗口处于活动状态,以便使用 SendMessage/PostMessage。

我终于设法使用以下代码使用firefox做到了这一点:

这很好用!但是,如果应用程序未处于活动状态,例如,如果记事本覆盖了 firefox,则 GUIThreadInfo 将带有每个成员 null。只有当 firefox 是 windows 的最顶层(活动)应用程序时,才会填充该结构。

我知道这可以通过将 firefox 置于前台来解决,但我需要避免这样做。有没有人有任何其他想法来获取不是 Windows 中最顶层窗口的应用程序的活动子窗口?

谢谢

0 投票
2 回答
2180 浏览

c# - 如何获取应用程序的活动 ChildWindow?

我有这个问题:我有一个特定应用程序的主窗口的处理程序,我想在那个应用程序上模拟一个按键......

我正在使用 sendMessage/postMessage api 调用来执行此操作。我不使用 .Net SendKeys 函数或 win32 api 的 keybd_event 的原因是它们在全局级别模拟按键。在我的情况下,目标应用程序不是最活跃的应用程序(其他应用程序可能运行在更高的 z 级别,因此覆盖了目标应用程序)。

sendMessage 和 postMessage 的问题在于,您必须传递要按下键的确切子窗口的处理程序。例如,在记事本中,如果我将密钥发送到主窗口的处理程序,什么也没有发生,我必须将密钥发送到子窗口的处理程序,该子窗口基本上由您可以编写的白色画布组成。

获取活动子窗口的处理程序是问题所在。一开始,我使用 GetTopWindow 或 GetWindow(GW_CHILD) api 调用,因为它返回最活跃的子窗口。我正在做的是继续调用 GetWindow(GW_CHILD),直到我得到一个没有更多 childWindows 的 childwindow。这适用于记事本或绘画等某些应用程序。但是,在某些情况下(例如 Firefox),它不起作用。原因是父窗口有整个firefox区域,而它的子窗口有打开的网页(如google)。所以,当我询问主窗口最活跃的子窗口时,它返回它拥有的唯一子窗口,也就是网页区域对应的那个。它仅在活动窗口是那个窗口时才有效(例如,如果用户在某个页面的文本框上写东西)。

我实际上找到了一种方法,使用 GetGUIThreadInfo api调用,使用以下代码:

而且效果很好:如果地址栏处于活动状态,它会向地址栏发送一个“W”字母。如果谷歌的搜索文本框处于活动状态,它会向它发送“W”字母......完美!但是,我不能使用这种方法,原因很简单:如果目标应用程序不是操作系统的活动窗口,则 ThreadInfo 结构为空。例如,如果我的目标是 firefox,如果 firefox 处于活动状态(最顶层的应用程序,聚焦/活动的应用程序),它就可以工作,但是如果,比如说,记事本位于 firefox 之上,它就不起作用,它无法获取活动窗口处理程序。

我知道我可以通过使用 setForegroundWindow api 调用来激活目标应用程序然后捕获活动子窗口的处理程序来解决这个问题,但我不想将目标应用程序带到前台。

我还尝试了其他技术,例如 AttachThreadInput() 和 GetFocus() api 调用,它们也可以工作,但有同样的问题:如果目标应用程序不是活动的 Windows 应用程序,它就不起作用。

所以基本上我需要找到某种方法将处理程序获取到应用程序的活动子窗口,即使该应用程序不是最活跃的应用程序。

有任何想法吗?谢谢

0 投票
2 回答
3461 浏览

c# - 如何获取应用程序的活动 ChildWindow?

我想向某个不是 Windows 中的活动应用程序的应用程序发送一个 pressKey 事件,所以我必须使用 sendMessage/postMessage api 调用。

但是,我需要知道在应用程序中处于活动状态的确切子窗口并向其发送 pressKey 消息...

我正在使用 GetTopWindow 和 GetWindow(GW_CHILD) api调用来获取主窗口的顶部子窗口,并使用获得的子窗口再次执行以获取顶部的孙子窗口,并继续这样做直到我找到一个没有更多子窗口的子窗口. 这对某些应用程序非常有用,但在某些情况下则不然。有时父窗口是活动窗口,而不是其子窗口之一,因此获取父窗口的顶部子窗口将不起作用,因为我将向错误的窗口发送消息。

我发现这样做的唯一方法(获取实际活动窗口的处理程序)是使用 GuiThreadInfo api 调用,但它仅在目标应用程序是 Windows 中的活动应用程序时才有效。正如我在开头提到的那样,处理程序并非如此。

我可以使用 setForegroundWindow api 调用将应用程序置于顶部,但我不想这样做。我还尝试了 AttachThreadInput 和 GetFocus api 调用,但同样,它们仅在目标应用程序是 Windows 中的活动应用程序时才有效。

有任何想法吗?谢谢

0 投票
3 回答
6154 浏览

c# - 最大化 MDI 子项时删除 MDI 容器窗体的默认 MDI 菜单

我正在开发一个 .NET C# 应用程序,该应用程序的主窗体是 MDI 容器。当用户最大化 MDI 子项时,Windows 会在容器窗体的标题栏下方绘制一个控制条,其中包含子项的图标和右侧的系统按钮。基本上,我需要的是隐藏此条并使用自定义控件来提供相同的功能。

有什么办法可以阻止 Windows 绘制这个 MDI 条?

0 投票
0 回答
372 浏览

c++ - Vista 中的 ALT+TAB 激活主窗口而不是以前活动的子窗口

我的应用程序(用 C++ 编写)使用 Win32(不是 MFC)通过 CreateWindowEx 创建几个窗口。主窗口以桌面为父窗口,子窗口以主窗口为父窗口。

我的问题:

  • 该应用程序有一个活动的子窗口
  • 我切换到另一个应用程序(每次点击,ALT+TAB 或其他,没关系)
  • 我用 ALT+TAB 切换回我的应用程序

现在我的应用程序的主窗口被激活,不再是子窗口。如果我切换回单击任务栏条目,则子窗口仍处于活动状态。

这只发生在 Aero(有和没有 Glass)上。如果我激活经典的 Window Scheme,一切都像在 Windows XP 下一样(使用 ALT+TAB 切换回来使子窗口保持活动状态)。

任何建议或链接或其他资源?

(示例代码有点难以提供,因为 UI 元素被包装在具有自己的字符串等数据类型的类中。)

似乎具有经典方案的 Vista 将 WM_ACTIVATE 发送到主窗口,将另一个 WM_ACTIVATE 发送到第二个窗口(由主窗口拥有)。启用 Vista Aero 后,只有主窗口会获得 WM_ACTIVATE。奇怪的。

0 投票
1 回答
588 浏览

silverlight-3.0 - Silverlight 2 ChildWindow - 如何改变弹出方式?

我喜欢 Silverlight 3 中的 ChildWindow,但我不喜欢它出现在屏幕上的方式。它看起来太快了,甚至会刺激眼睛。也许有人知道如何改变这种方式,让它更柔软,也许更慢?谢谢

0 投票
2 回答
4033 浏览

c# - 如何从其中加载的 UserControl 按钮关闭 ChildWindow?

这是我的 ChildWindow xaml 代码:

这是我的 UserControl1 xaml 代码:

这是我的用户控件 C#:

尝试这种方法是行不通的。任何想法?

Tks 乔西