我想使用IsIconic函数来检查指定的窗口是否被最小化(图标)。
IsIconic功能
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms633527(v=vs.85).aspx
我的代码在某些环境中正常运行,但在其他环境中无效。
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function IsIconic(ByVal hWnd As IntPtr) As Long
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hWnd As IntPtr = FindWindow(Nothing, "Google - Google Chrome")
If CBool(IsIconic(hWnd)) Then
Debug.WriteLine("Chrome is iconic.")
Else
Debug.WriteLine("Chrome is not iconic.")
End If
End Sub
End Class
当我使用64位Windows 7操作系统运行时,我可以正确判断Chrome是否已图标化。 但是,在32位Windows 7操作系统上运行时,“Chrome是标志性的”。无论Chrome是否实际图标化,都会立即显示在即时窗口中。
你能告诉我为什么会出现这种差异吗? 这种现象是由OS位数的差异引起的吗?或其他什么?
答案 0 :(得分:0)
IsIconic()
function的返回类型错误。
此:
Public Shared Function IsIconic(ByVal hWnd As IntPtr) As Long
......应该是这样的:
Public Shared Function IsIconic(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
这也意味着你可以(并且应该)改变:
If CBool(IsIconic(hWnd)) Then
Debug.WriteLine("Chrome is iconic.")
Else
...
为:
If IsIconic(hWnd) Then
Debug.WriteLine("Chrome is iconic.")
Else
...