Я проверяю, является ли кнопка флажком 32-битного процесса на 64-битном windows10.
Проблема в том, что я не могу отличить флажок sh от обычной кнопки.
( После перезапуска приложения даже Window-Detective показывает теперь это кнопка! )
Но флажок не может быть распознан как флажок в Spy ++
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;
}
Отладочный вывод
Код указывает, что они оба имеют 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);
}
}
}