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 documentantionから):

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()

これは、Microsoftによる自動化UIフレームワークを使用します

于 2012-08-31T08:09:37.957 に答える