Coding style 针对_WinAPI_EnumDisplayDevices()的条件语句:有更好的方法吗?

Coding style 针对_WinAPI_EnumDisplayDevices()的条件语句:有更好的方法吗?,coding-style,conditional,autoit,Coding Style,Conditional,Autoit,我正在执行_WinAPI_EnumDisplayDevices()函数。然而,我的机器报告了3个额外的虚拟监视器,我的输出不需要这些虚拟监视器。所以我创建了一个If语句,如果出现特定的标志(例如1、2、3、35或33作为标志返回),它只返回那些监视器。但是,我的条件语句有多长让我感到不舒服: $_enum = _WinAPI_EnumDisplayDevices("", $x) If $_enum[3] = 1 OR $_enum[3] = 2 OR $_enum[3] = 3 OR $_enu

我正在执行_WinAPI_EnumDisplayDevices()函数。然而,我的机器报告了3个额外的虚拟监视器,我的输出不需要这些虚拟监视器。所以我创建了一个If语句,如果出现特定的标志(例如1、2、3、35或33作为标志返回),它只返回那些监视器。但是,我的条件语句有多长让我感到不舒服:

$_enum = _WinAPI_EnumDisplayDevices("", $x)
If $_enum[3] = 1 OR $_enum[3] = 2 OR $_enum[3] = 3 OR $_enum[3] = 33 OR $_enum[3] = 35 Then

有没有更好的方法可以用更少的工作量获得相同的结果?

发现了_ArraySearch()函数,它允许我搜索数组中的值,并根据找到或没有找到的内容返回不同的标志。因此,我可以创建一个包含所有值的数组,然后针对该数组对$_enum[3]执行_ArraySearch()

编辑:这就是我的结局:

Dim $x = 0, $y = 0, $_enum, $_PhysMon[15] = [1,2,8,32,3,9,33,10,34,40,11,35,36,42,51], $_DefMon[8] = [2,3,10,34,11,35,42,43]
Do
    $_enum = _WinAPI_EnumDisplayDevices("", $x)
    $_physCheck = _ArraySearch($_PhysMon, $_enum[3])
    $_defCheck = _ArraySearch($_DefMon, $_enum[3])
    $x+=1
    msgbox(0,"","Phys Check:  " & $_physCheck & @LF & "Def Check:   " & $_defCheck)
    If $_physCheck <> -1 AND %_defCheck <> -1 Then
        msgbox(0,"","Monitor " & $x & " IS THE PHYSICAL DEFAULT MONITOR")
    ElseIf $_physCheck <> -1 Then
        msgbox(0,"","Monitor " & $x & " IS A PHYSICAL MONITOR")
    Else
        msgbox(0,"","Monitor " & $x & " IS A VIRTUAL MONITOR")
    EndIf
Until NOT $_enum[3]
Dim$x=0,$y=0,$_enum,$_PhysMon[15]=[1,2,8,32,3,9,33,10,34,40,11,35,36,42,51],$_DefMon[8]=[2,3,10,34,11,35,43]
做
$\u enum=\u WinAPI\u EnumDisplayDevices(“,$x)
$\u physCheck=\u ArraySearch($\u PhysMon,$\u enum[3])
$\u defCheck=\u ArraySearch($\u DefMon,$\u enum[3])
$x+=1
msgbox(0,“,”物理检查:&$\u physCheck&@LF&“Def检查:&$\u Def检查)
如果$\u physCheck-1和%\u defCheck-1,则
msgbox(0、“、”监视器“&$x&“是物理默认监视器”)
ElseIf$_physCheck-1那么
msgbox(0、“、”监视器“&$x&“是物理监视器”)
其他的
msgbox(0、“、”监视器“&$x&“是虚拟监视器”)
恩迪夫
直到不是$_enum[3]

我已经设置了所有可能的标志组合,并且成功地解析了哪些监视器是真实的(物理的)与哪些监视器不是真实的(虚拟的),我甚至还定义了机器的默认显示。

您应该注意标志的含义。查看_WinAPI_EnumDisplayDevices下的示例

本质上,当您检查标志1、2、3、33或35时。您只需要检查标志1、2和32。其中“3=2+1”和“35=32+2+1”以及“33=32+1”。使用BitAnd功能,您可以更轻松地检查这些

您的条件将成为:

If BitAND($_enum[3], 1) Or BitAND($_enum[3], 2) Or BitAND($_enum[3], 32) Then
这稍微短一点,但是如果其他人正在阅读应用程序,他仍然不会理解它。您可以通过注释或将条件移动到新函数来解决此问题。下面是一个函数示例:

$_enum = _WinAPI_EnumDisplayDevices("", $x)
If isValidMonitor($enum[3]) Then
    ; Do things
EndIf

Func isValidMonitor($i)
    Return BitAND($i, 1) Or BitAND($i, 2) Or BitAND($i, 32)
EndFunc

我选择isValidMonitor名称是因为我不确定您的代码的用途。也许更好的名称是“isPrimaryDesktop()”,但我会删除对标志32的检查。不过,您可以看到,您的代码立即更具可读性。

您应该修改原始帖子,看看它的实际含义。提示:这不是你发布的答案。不要走_ArraySearch路线,而是像函数实际设计的那样使用BitAND。