C# 将外部应用程序移到屏幕前部

C# 将外部应用程序移到屏幕前部,c#,winapi,C#,Winapi,我正在运行的应用程序需要调用一个单独的应用程序来进行扫描。我通过启动一个新的System.Diagnostics.Process调用另一个应用程序。一旦我得到了这个过程,我就调用一个方法来为这个应用程序提供焦点。我尝试了两种不同的方法来让外部应用程序成为焦点,但都不起作用。有人能帮忙吗 代码如下: using System.Runtime.InteropServices; [DllImport("user32.dll")] private static extern bool

我正在运行的应用程序需要调用一个单独的应用程序来进行扫描。我通过启动一个新的
System.Diagnostics.Process
调用另一个应用程序。一旦我得到了这个过程,我就调用一个方法来为这个应用程序提供焦点。我尝试了两种不同的方法来让外部应用程序成为焦点,但都不起作用。有人能帮忙吗

代码如下:

using System.Runtime.InteropServices;

    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, uint windowStyle);

    [DllImport("user32.dll")]
    private static extern bool SetWindowPos(IntPtr hWnd, 
      IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

    [DllImport("user32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    private static void GiveSpecifiedAppTheFocus(int processID)
    {
        try
        {
            Process p = Process.GetProcessById(processID);

            ShowWindow(p.MainWindowHandle, 1);
            SetWindowPos(p.MainWindowHandle, new IntPtr(-1), 0, 0, 0, 0, 3);

            //SetForegroundWindow(p.MainWindowHandle);
        }
        catch
        {
            throw;
        }
    }
第一种场景使用
ShowWindow
SetWindowPos
方法,另一种方法使用
SetForegroundWindow
方法。两者都不起作用


我是否使用了错误的方法,或者我使用的代码中是否存在错误?谢谢大家

使用SetWindowPos,但当您不想让窗口成为最顶层时,请再次调用它,将第二个参数设置为-2(HWND_NOTOPMOST),而不是-1(HWND_topmost)

尝试将进程设置为后台,即:this.SendToBack();这只是另一个解决方案,部分修复。

SetForegroundWindow应该可以工作,在调用GiveSpecifiedAppTheFocus之前是否启动了该应用程序?是的,下面是流程。1) 接收要发送给扫描实用程序的消息,2)检查扫描实用程序是否正在运行(如果是,请转到4),3)启动扫描实用程序,4)向扫描实用程序发送要扫描的文档,5)将焦点交给扫描实用程序。我没有收到任何错误消息或任何东西…只是再次尝试了ShowWindow/SetWindowPos方法,它现在可以工作了,但它始终位于顶部,即使我单击了后台的应用程序。我正在再次尝试前台版本…SetForeGroundIndow不起作用…太棒了,它起作用了!private static void GiveSpecifiedAppTheFocus(int-processID){try{Process p=Process.GetProcessById(processID);//ShowWindow(p.MainWindowHandle,1);SetWindowPos(p.MainWindowHandle,new-IntPtr(0),0,0,0,3);//setForeGroundInow(p.MainWindowHandle);}catch{throw;}