菜单栏程序 - 将焦点设置到第 3 方应用程序
Posted
技术标签:
【中文标题】菜单栏程序 - 将焦点设置到第 3 方应用程序【英文标题】:Menubar program - Set focus to 3rd party application 【发布时间】:2015-06-05 03:36:05 【问题描述】:我试图通过谷歌找到答案,但我想我没有使用正确的术语。
我正在创建的是一个由菜单条组成的简单 Windows 应用程序。该程序假设找到已经运行的现有应用程序的焦点并将其自身“附加”到顶部。
这是一个较旧的窗口游戏,我正在尝试为它创建一个工具集。
我喜欢它是持久的,并且如果游戏也被移动,它也会跟随。而是一步一个脚印。
我想我的问题是我想要完成的正确术语是什么。一旦我知道我会去做一些功课
【问题讨论】:
您可以使用 GetWindowRect (msdn.microsoft.com/en-us/library/windows/desktop/…) 获取窗口位置,并定期检查窗口是否移动并根据需要调整窗口。不过有一些报告称这个 API 在 Vista 上返回了错误的值,不确定它是否已在 7/8/X 中修复。 “焦点”是错误的词。焦点是窗口/控件接收用户输入的状态。您正在输入的窗口将具有焦点。你想找到给定进程的主窗口,然后把你自己进程的窗口放在它附近。 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 【参考方案1】:您可以使用uiacomwrapper 关注窗口,我什至在github 上有示例应用程序。按钮单击应用程序将附加到 IE 并一起移动。
private void Button_Click(object sender, RoutedEventArgs e)
string lpszParentClass = "IEFrame";
IntPtr ParenthWnd = new IntPtr(0);
ParenthWnd = FindWindow(lpszParentClass, null);
if (!ParenthWnd.Equals(IntPtr.Zero))
var parent = AutomationElement.FromHandle(ParenthWnd);
Automation.AddAutomationPropertyChangedEventHandler(parent, TreeScope.Element, WindowMoved, AutomationElement.BoundingRectangleProperty);
private void WindowMoved(object sender, AutomationPropertyChangedEventArgs e)
App.Current.Dispatcher.BeginInvoke(new Action(() =>
if (e.NewValue != null)
var newPosition = (Rect)e.NewValue;
this.Left = newPosition.Left;
this.Top = newPosition.Top;
));
【讨论】:
以上是关于菜单栏程序 - 将焦点设置到第 3 方应用程序的主要内容,如果未能解决你的问题,请参考以下文章