C# 将当前进程窗口移到前面

C# 将当前进程窗口移到前面,c#,.net,vb.net,C#,.net,Vb.net,我每小时打一个电话来截图。 但问题在于激活车窗或将车窗移到前部。 如果前面有其他应用程序,那么在拍摄屏幕截图时,它们会出现在前面。 发生什么事了 <Runtime.InteropServices.DllImport("user32.dll")> Private Function SetForegroundWindow(ByVal hWnd As IntPtr) As Integer End Function <Runtime.InteropServices.DllImport

我每小时打一个电话来截图。 但问题在于激活车窗或将车窗移到前部。 如果前面有其他应用程序,那么在拍摄屏幕截图时,它们会出现在前面。 发生什么事了

<Runtime.InteropServices.DllImport("user32.dll")>
Private Function SetForegroundWindow(ByVal hWnd As IntPtr) As Integer
End Function

<Runtime.InteropServices.DllImport("user32.dll")>
Private Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As IntPtr
End Function

Public Sub TakeScreenshot()
        Dim thread As New Threading.Thread(AddressOf TakeScreenShotThread)
        thread.Start()
End Sub

Public Function TakeScreenShotThread() As Integer
        Dim proc As Process = Process.GetCurrentProcess
        Call SetForegroundWindow(proc.MainWindowHandle)
        Call ShowWindow(proc.MainWindowHandle, 5)

                    'GIVE IT TIME TO DISPLAY THE APP AND ACTIVATE WINDOW
        Dim t = Threading.Tasks.Task.Run(Async Function()
                                             Await Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(200))
                                             Return 1
                                         End Function)

        t.Wait()

                    'SAVE SCREENSHOT IMAGE CODE HERE
End Function

不幸的是,如果从用户的角度考虑,幸运的是setforegroundindow不是一个无条件的命令,那么就让这个窗口成为最重要/最活跃的命令

它有一套:

系统限制哪些进程可以设置前台窗口。仅当以下条件之一为真时,进程才能设置前景窗口:

这个过程就是前景过程。 该进程由前台进程启动。 进程接收到最后一个输入事件。 没有前台进程。 进程正在调试中。 前台进程不是现代应用程序或开始屏幕。 前景未锁定请参见LockSetForegroundWindow。 前台锁定超时已过期,请参阅系统参数信息中的SPI_GETFOREGROUNDLOCKTIMEOUT。 没有激活的菜单

因此,尽管有一些不推荐的方法可以克服这个限制,但在正常情况下,除非其中一个条件为真,否则setForeGroundIndow将不起作用

附言:另外,建议阅读-


p.S.1:虽然这一限制可能是原始解决方案失败的原因,但我还想指出,proc.MainWindowHandle可能是IntPtr.Zero,或者是来自某个起始窗口等的过时句柄,并且您不从WIN API函数返回值,这一点非常重要,可能有助于解决问题……

您是否尝试过翻转外部呼叫的顺序?尝试先调用ShowWindow,然后再调用SetForegroundWindow。它可能会产生不同的结果。如果这是winforms,您也可以尝试使用Show函数和表单的最顶端属性将其发送到前端。假设它是winform,您可以尝试使用此处描述的技术截屏表单。在这种情况下,您不需要弹出应用程序。当然,这种方法有一些局限性。作弊是可能的: