Делаем “управляемые” и обычные формы неуправляемыми




По мотивам недавней публикации http://infostart.ru/public/140057/. Доводим идею публикации до логического завершения, т.е. до полной противоположности.

Для получения временного контроля над пользовательским интерфейсом 1С нам необходимо знать текущие координаты указателя мыши, и  дескриптор окна, под указателем.  Получить текущие координаты указателя, можно применив стандартный прием, установив низкоуровневый hook на перемещения мыши.  В определении дескриптора окна под указателем нам поможет функция WindowFromPoint. Теперь с данным окном можно выполнить некоторые манипуляции, изменив его внешний вид и поведение.

 Из всего разнообразия окон 1С выберем следующие классы:

V8FormElementнаиболее распостраненный вид  (текстовые поля, метки, списки, и.т.д);

V8MDILocalFrameглавное окно в 8.1 и 8.2 (MDI интерфейс);

V8TopLevelFrameSDI, V8TopLevelFrameSDIsec – окна верхнего уровня 8.2 (SDI интерфейс).

Чтобы изменить внешний вид окна, воспользуемся парой функций —  GetWindowLong (считывает биты стиля)  и  SetWindowLong (устаналивает биты стиля).  Для получения эффекта «зеркальное отражение» — отображение текста справа налево, нужно всего лишь установить бит стиля WS_EX_LAYOUTRTL. Стереть элемент управления можно, обнулив бит стиля WS_VISIBLE или при помощи функции MoveWindow, установив ширину и высоту окна равными 0. Эффекты «разбегания» и «дрожания» элементов управления, при наведении на них указателя мыши можно реализовать при помощи все той же функции MoveWindow.

 Для окон верхнего уровня эффект «прозрачности» можно получить следующим образом – устанавливаем бит стиля WS_EX_LAYERED, затем вызываем функцию SetLayeredWindowAttributes. Причем, если до вызова этой функции  не был установлен бит WS_EX_TRANSPARENT, c  окном  можно работать в обычном режиме, несмотря на его «прозрачность», в противном  случае указатель мыши будет «проваливаться» на окна лежащие ниже по Z-координате.

 В файле находится приложение, реализующее, описанные эффекты. Для его работы необходим Net Framework 2.0.

 Пример установки hook в среде .Net :

http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

 Объявления функций API и примеры:

http://www.pinvoke.net/

14 Comments

  1. DoctorRoza

    За творчество!! ))

    Reply
  2. slimper

    (1) DoctorRoza, Спасибо!

    Reply
  3. khaoos

    Не думаю, что когда-нибудь пригодятся такие фокусы, но автор молодец!

    Reply
  4. slimper

    (3) khaoos, эти фокусы всего лишь небольшая компенсация для себя, за то, что приходится иметь дело с 1С.

    Reply
  5. Dethmond

    Спасибо, как раз то, что нужно.

    Reply
  6. dimetra2008

    Спрашивается, а нафига все это?

    Reply
  7. slimper

    (6) dimetra2008, A вы делаете только то, за что можно поучить деньги?

    Reply
  8. dimetra2008

    (7)

    Иногда бесплатно делаю.

    Мне интересен практическое применение этого добра.

    Reply
  9. slimper

    (8) dimetra2008, поиск подходов по динамическому изменению пользовательского интерфейса 1С.

    Reply
  10. dimetra2008

    (9)

    Я думаю что 1С тож над этим работает… 😉

    Reply
  11. Stim213

    хорошее решение для обфускации пользовательского интерфейса =)

    Reply
  12. slimper

    (11) Stim213, это не решение, a побочный продукт экспериментов с UI.

    Reply
  13. ms200999

    Забавно. Наверное, практического применения не имеет, но плюса публикация однозначно заслуживает.

    Reply
  14. ErrorEd88

    Буду увольняться, скачаю)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *