IsIconic()行为因环境而异

时间:2017-08-01 13:05:14

标签: vb.net winapi

我想使用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位数的差异引起的吗?或其他什么?

1 个答案:

答案 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
    ...