菜单栏程序 - 将焦点设置到第 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 方应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 在 Windows 上按下 Alt 后防止菜单栏抓住焦点

从 Facebook 广告到第 3 方应用的深度链接

将 MacOS X 菜单栏应用程序设置为在启动时启动

将鼠标悬停在菜单上时,将焦点从下拉列表设置到窗口

Qt菜单栏和标题栏怎么合一?

使用 C++ 在我的应用程序的菜单栏中创建“保存当前设置”功能