在VB.NET中,如何在屏幕上切换自己的进程或其他进程?

时间:2014-06-06 17:14:51

标签: vb.net windows windows-7 process window

这不重复。还有许多类似的问题,但他们的答案都不适合我,甚至在Hello World应用程序中都没有。

基本上我有一个VB.NET程序和一个Adobe AIR程序,我需要VB.NET程序才能切换哪一个在另一个之前。我一直在研究用VB在VB.NET中做这样的事情的API,但它们都没有被淘汰出局。我甚至将它缩减为一个Hello World程序,它在自己和另一个.NET可执行文件之间切换,但它最常做的是在屏幕底部的Windows 7任务栏上闪烁橙色;无论哪个可执行文件都在前面,无论如何都会留在那里。

我在互联网上看到的大多数API使用user32.dll(顺便说一句,这是一台32位机器),它们使用ShowWindow,SetForegroundWindow等其他功能像那样。这是一个经过尝试的例子:

Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("user32.dll")> _
    Private Shared Function SetForegroundWindow(ByVal pHWND As IntPtr) As _
            <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    Private m_hwndSelf As IntPtr = Process.GetCurrentProcess().MainWindowHandle
    Private m_procApp As Process

    Private m_blnFlag As Boolean = True

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim prInfo As New ProcessStartInfo("somePath/someProg.exe", "")
        prInfo.UseShellExecute = False
        m_procApp = Process.Start(prInfo)

        Timer1.Interval = 5000
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If m_blnFlag Then
            SetForegroundWindow(m_procApp.MainWindowHandle)
        Else
            SetForegroundWindow(m_hwndSelf)
        End If
        m_blnFlag = Not m_blnFlag
    End Sub
End Class

这可能不是火箭科学,而且可能是我犯的错误,但在搜索论坛等时我没有看到足够的解释。为什么这个程序没有切换到哪个窗口?为什么它只是闪烁橙色?其他相关功能似乎也没有工作,也没有其他尝试获取窗口句柄的方法,所以我的代码通常有什么问题?感谢。

1 个答案:

答案 0 :(得分:0)

问题在于我是如何尝试获取窗口句柄的。我应该使用Process.MainWindowHandle(在user32.dll中),而不是使用FindWindow(String, String)。特别是:

FindWindow(Nothing, "Program Name in the Taskbar")

从技术上讲,这还没有使用SetForegroundWindow(IntPtr)进行验证,但已经通过我之前尝试过的另一个user32.dll函数验证了ShowWindow(IntPtr, Integer)