0

我有一个 F# 应用程序,我需要在用户的默认浏览器中打开一个 URL。这一切都很好,通过以下方法处理得很好:

member this.openUrl (url:Uri) =
    ignore (System.Diagnostics.Process.Start(url.ToString()))

然而,在打开 URL 时,浏览器会获得焦点,使用户远离我的程序。这是次优的,因为用户可能希望快速连续打开多个页面。在这种情况下,浏览器获得焦点,使用户不得不手动切换回我的应用程序。这扰乱了我的应用程序的预期工作流程。

有没有办法阻止默认浏览器在要求它打开 URL 时变为活动状态?

如果您担心用户体验,您可以假设我将添加一个禁用此行为的选项。

4

2 回答 2

1

AppActive 可以满足您的需求。

Module Module1

    Sub Main()
        Dim processId As Integer = System.Diagnostics.Process.GetCurrentProcess().Id
        Console.WriteLine("Starting Google")
        System.Diagnostics.Process.Start("www.google.com")
        System.Threading.Thread.Sleep(1000)
        Console.WriteLine("Get Focus Back on Process {0}", processId)
        Microsoft.VisualBasic.Interaction.AppActivate(processId)
        Console.Write("Press any key")
        Console.ReadKey()
    End Sub

End Module

不要忘记在 F# 中添加对 Microsoft.VisualBasic 的引用

AppActivate http://msdn.microsoft.com/en-us/library/x9784w8e.aspx

许多用户在从命令行运行控制台程序时遇到 AppActivate 问题。答案如下(来自 AppActivate 文档):

您只能将 AppActivate 用于拥有窗口的进程。大多数控制台应用程序不拥有窗口,这意味着它们不会出现在 AppActivate 搜索的进程列表中。从控制台应用程序运行时,系统会创建一个单独的进程来运行应用程序并将输出返回到控制台进程。因此,当您请求当前进程 ID 时,您将获得此单独进程的进程 ID,而不是控制台应用程序的进程 ID。

于 2012-08-31T07:41:06.057 回答
0

你可能应该做这样的事情,
这段代码在 c# 中,但你可以轻松地将它移植到 f#

AutomationElement desktop = AutomationElement.RootElement;
AutomationElement mainForm = null;
do
{
    mainForm = desktop.FindFirst(TreeScope.Children,
        new PropertyCondition(AutomationElement.NameProperty, "MDSClientForm"));
    Thread.Sleep(100);
}
while (mainForm == null);
mainForm.setFocus()

这使用了微软的自动化 UI 框架

于 2012-08-31T08:09:37.957 回答