这不重复。还有许多类似的问题,但他们的答案都不适合我,甚至在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
这可能不是火箭科学,而且可能是我犯的错误,但在搜索论坛等时我没有看到足够的解释。为什么这个程序没有切换到哪个窗口?为什么它只是闪烁橙色?其他相关功能似乎也没有工作,也没有其他尝试获取窗口句柄的方法,所以我的代码通常有什么问题?感谢。
答案 0 :(得分:0)
问题在于我是如何尝试获取窗口句柄的。我应该使用Process.MainWindowHandle
(在user32.dll中),而不是使用FindWindow(String, String)
。特别是:
FindWindow(Nothing, "Program Name in the Taskbar")
从技术上讲,这还没有使用SetForegroundWindow(IntPtr)
进行验证,但已经通过我之前尝试过的另一个user32.dll函数验证了ShowWindow(IntPtr, Integer)
。