Условное заявление против _WinAPI_EnumDisplayDevices (): есть ли лучший метод? - PullRequest
3 голосов
/ 09 февраля 2012

Я выполняю функцию _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

Есть ли лучший способ сделать это, чтобы получить те же результаты с меньшим количеством работы?

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Вы должны принять к сведению, что означают флаги. Посмотрите пример в _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. Однако вы можете видеть, что ваш код мгновенно становится более читабельным.

0 голосов
/ 09 февраля 2012

Обнаружена функция _ArraySearch (), которая позволяет мне искать значение в массиве и возвращает разные флаги в зависимости от того, что он находит или не находит.Поэтому я могу создать массив со всеми значениями, а затем выполнить _ArraySearch () для $ _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,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]

Я установил все возможные комбинации флагов и успешно проанализировал, какие мониторы являются реальными (физическими), а не реальными (виртуальными), и я даже определил отображение машины по умолчанию.

...