Как проверить, установлен ли флажок на 64-битной windows? - PullRequest
0 голосов
/ 12 марта 2020

Я проверяю, является ли кнопка флажком 32-битного процесса на 64-битном windows10.

Проблема в том, что я не могу отличить флажок sh от обычной кнопки.

кнопки различаются в Window-Detective :

enter image description here

( После перезапуска приложения даже Window-Detective показывает теперь это кнопка! )

Но флажок не может быть распознан как флажок в Spy ++

enter image description here

BS_CHECKBOX не указан.

Код (скомпилированный как 32-битный):

TEST_METHOD(ShouldCheckStyle) {
    auto styleOfButton =    ::GetWindowLongPtr((HWND)0x003F06E8, GWL_STYLE);
    auto styleOfCheckbox =  ::GetWindowLongPtr((HWND)0x01101642, GWL_STYLE);
    auto bsOfButton =       styleOfButton & BS_TYPEMASK;
    auto bsOfCheckbox =     styleOfCheckbox & BS_TYPEMASK;
    auto resultOfButton =   (bsOfButton == BS_CHECKBOX);
    auto resultOfCheckbox = (bsOfCheckbox == BS_CHECKBOX);
    auto debugger = 0;
}

Отладочный вывод

enter image description here

Код указывает, что они оба имеют BS_OWNERDRAW. Вышеописанное ведет себя одинаково для кнопки и флажка.

Странная вещь: Window-Detective может распознавать стиль флажка. Код такой же, как я использовал выше. Вот кусок кода:

Window* WindowManager::createWindow(HWND handle) {
    WindowClass* windowClass = getWindowClassFor(handle);

    String className = windowClass->getName().toLower();
    if (className == "button") {
        LONG typeStyle = GetWindowLong(handle, GWL_STYLE) & BS_TYPEMASK;
        switch (typeStyle) {
          case BS_CHECKBOX:
          case BS_AUTOCHECKBOX:
          case BS_3STATE:
          case BS_AUTO3STATE: {
              return new CheckBox(handle, windowClass);
          }
          case BS_RADIOBUTTON:
          case BS_AUTORADIOBUTTON: {
              return new RadioButton(handle, windowClass);
          }
          case BS_GROUPBOX: {
              return new GroupBox(handle, windowClass);
          }
          default: {
              // If none of the above is true, then the control is just a Button
              return new Button(handle, windowClass);
          }
        }
    }

1 Ответ

0 голосов
/ 13 марта 2020

После некоторого обсуждения вы можете использовать GetWindowText , чтобы получить текст из каждого элемента управления и сравнить указанный текст c.

BS_CHECKBOX не может быть обнаружен из свойств элемент управления "checkbox" из-за BS_OWNERDRAW .

Создает кнопку, нарисованную владельцем. Окно владельца получает сообщение WM_DRAWITEM, когда визуальный аспект кнопки изменился. Не комбинируйте стиль BS_OWNERDRAW с другими стилями кнопок.

Попробуйте следующий код:

WCHAR str1[20];
WCHAR str2[] = L"Agree me";

GetWindowText(hwnd_checkbox, str1, 256);
if (_tcscmp(str1, str2) == 0)
{
    //it is checkbox                        
}
else
{
    //it isn't checkbox
}

После того, как вы получите правильный дескриптор управления флажком, вы можете использовать SendDlgItemMessage или SendMessage для отправки BM_SETCHECK сообщения проверки.

SendMessage(hwnd_checkbox, BM_SETCHECK, BST_CHECKED, 0);

...