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




По мотивам недавней публикации 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 не будет опубликован. Обязательные поля помечены *