2017-02-11 3 views
-1

Я пытаюсь прагматично найти статическую метку из некоторых подобных программ. Я считаю, что одна из статических меток не имеет стиля «WS_VISIBLE», но все еще видна в одной из программ.Что может вызывать ярлык «Статический» без WS_VISIBLE на окнах

Итак, что может привести к появлению статической метки без стиля WS_VISIBLE? И как я могу отличить его от других меток, которые не видны без «WS_VISIBLE»?


Я пишу пример кода, чтобы воспроизвести случай, но не удалось.

TEST_METHOD(ShouldSetWindowsLong) { 
    auto handle = HWND(0x00180BDC); // A handle to another similar visible Static 
    auto style = (DWORD)::GetWindowLong(handle, GWL_STYLE); 
    style &= ~WS_VISIBLE; 
    ::SetWindowLong(handle, GWL_STYLE, style); 
} 

После запуска выше коды, этикетка «статической» не «» WS_STYLE и не видно больше.

+5

Другая возможность заключается в том, что текст, который вы видите, не нарисован статическим контролем, а кем-то другим. Для доступности доступна невидимая статическая метка. –

+0

Не уходите, понимаете, я использовал SPY ++, чтобы найти эти проблемы. Я видел статическую метку, содержащую видимый текст, но не имеющий WS_VISIBLE. – user1633272

+0

Вы обнаружили невидимый статический контроль, поэтому его текст не нарисован. Но, возможно, кто-то * еще * рисует текст. –

ответ

0

И что может привести к появлению статической метки без стиля WS_VISIBLE?

Стиль WS_VISIBLE может быть включен и выключен SetWindowLong, не влияя на видимость. Вызов ShowWindow, ShowWindowAsync, или SetWindowPos, установит флаг WS_VISIBLE, чтобы отобразить фактическую видимость.

И как я могу отличить его от других меток, которые не видны без «WS_VISIBLE»?

Программно, вы не можете, если вы не контролируете это окно.

+0

Итак, если это так, то возможно, что «Статический» изначально видимый, но позже «WS_VISIBLE» удаляется «SetWindowsLog». Я напишу пример кода, чтобы доказать это. – user1633272

+0

Кажется, SetWindowLong влияет на видимость! – user1633272

+0

Хорошие новости. Windows развивается, несмотря на то, что говорят документы: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644898(v=vs.85).aspx «Некоторые данные в окне кэшируются, поэтому изменения вы make using SetWindowLongPtr не вступает в силу до тех пор, пока вы не вызовете функцию SetWindowPos. " – Laszlo