Blog. Just Blog

Образ мышления: Assembler

То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал Образ мышления: Assembler - Карта сайта

Как узнать раскладку клавиатуры другого приложения

21.01.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем, как можно узнать раскладку клавиатуры, которая активна в окне того или иного приложения. Также она может называться идентификатор языка ввода. С оконными приложениями все просто. Зная хэндл окна, через GetWindowThreadProcessId получаем идентификатор процесса, которому принадлежит исследуемое окно, а затем с помощью функции GetKeyboardLayout получаем код раскладки клавиатуры, которая активна в этом окне. Для консольных окон немного сложнее, так как они не реагируют на GetKeyboardLayout. Но это можно сделать при помощи недокументированной функции GetConsoleKeyboardLayoutName, которая возвращает код раскладки клавиатуры в виде строки. Просто так работать с консолью нельзя, для этого надо предварительно приаттачиться к процессу консольного окна, а после получения нужных данных отключиться от него.
  1.         ; Получить активное окно
  2.         invoke  GetForegroundWindow
  3.         ; Получить идентификатор процесса
  4.         invoke  GetWindowThreadProcessId,eax,pID
  5.         mov     ebx,eax
  6.  
  7.         ; Это консольное окно?
  8.         invoke  AttachConsole,[pID]
  9.         or      eax,eax
  10.         jz      .loc_gui
  11.  
  12. .loc_console:
  13.         ; Получить раскладку консольного окна
  14.         invoke  GetConsoleKeyboardLayoutName,buff
  15.         or      eax,eax
  16.         jnz     @f
  17.  
  18.         ; Не получилось, отключиться от консоли
  19.         invoke  FreeConsole
  20.         ; Попробовать получить раскладку как у оконного приложения
  21.         jmp     .loc_gui
  22. @@:
  23.         ...
  24.         ; В buff строка с кодом раскладки типа "00000419"
  25.         ...
  26.  
  27.         ; Просто отключиться от консоли
  28.         invoke  FreeConsole
  29.         jmp     .loc_done
  30.  
  31. .loc_gui:
  32.         ; Получить идентификатор раскладки клавиатуры
  33.         invoke  GetKeyboardLayout,ebx
  34.         and     eax,0xFFFF
  35.         ...
  36.         ; В EAX код раскладки
  37.         ...
  38. .loc_done:
  39.         ...
Если все прошло нормально, то у нас будет или числовой код раскладки, или строка с кодом раскладки, из которой этот код можно легко извлечь. Конечно, пользователю правильнее будет показывать не просто набор цифр, а человекопонятные названия раскладки. Соответствие кодов раскладок названиям языков можно посмотреть в MSDN, а можно переложить эту задачу на систему и воспользоваться функцией VerLanguageName или GetKeyboardLayout с флагом LOCALE_SLANGUAGE.

Читать статью целиком »
Просмотров: 224 | Комментариев: 7

Отслеживание изменения системного времени

23.12.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter

Отслеживание изменения системного времени

Если ваша программа работает с системным временем, то хорошей практикой будет возможность отслеживать факт его изменения. Это может быть как ручное изменение настроек даты и времени через Панель управления, так и программное изменение времени функциями типа SetSystemTime или SetLocalTime, сути не меняет. Соответственно, при наступлении такого события ваша программа должна переустановить какие-то свои внутренние таймеры, проконтролировать и пересчитать интервалы между процессами и т.п.

Читать статью целиком »
Просмотров: 378 | Комментариев: 0

Универсальное субклассирование окон на Ассемблере

05.12.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Тема субклассирования окон уже не один раз поднималась в статьях на этом сайте. Теперь пришло время навести порядок и сделать наиболее удобное и универсальное решение для этой задачи. Воспользуемся функциями SetProp и GetProp, чтобы хранить адреса обработчиков прямо в свойствах окна без заведения дополнительных переменных.
  1. ;-------------------------------------------------------------------------
  2. ; Наименования свойств. Можно переименовать, если конфликтуют с другими 
  3. ; строками в программе
  4. ;-------------------------------------------------------------------------
  5. szOld   db 'OldWndProc', 0
  6. szNew   db 'NewWndProc', 0
  7.  
  8. ;-------------------------------------------------------------------------
  9. ; Функция субклассирования окна
  10. ;-------------------------------------------------------------------------
  11. ;  hWnd - хэндл окна для субклассирования
  12. ;  SubclassProc - адрес нового обработчика окна
  13. ;-------------------------------------------------------------------------
  14. proc SubclassWindow hWnd:DWORD,SubclassProc:DWORD
  15.         pusha
  16.  
  17.         ; Получить старый обработчик окна
  18.         invoke  GetWindowLong,[hWnd],GWL_WNDPROC
  19.         ; Сохранить его в свойствах окна
  20.         invoke  SetProp,[hWnd],szOld,eax
  21.         ; Сохранить в свойствах новый обработчик окна
  22.         invoke  SetProp,[hWnd],szNew,[SubclassProc]
  23.         ; Назначить окну универсальную функцию обработки
  24.         invoke  SetWindowLong,[hWnd],GWL_WNDPROC,CommonSubclassProc
  25.  
  26.         popa
  27.         ret
  28. endp
Использование функции простейшее. Обычно на этапе инициализации окна нужным элементам назначаются собственные обработчики:
  1.         ; Субклассировать поле ввода
  2.         invoke  GetDlgItem,[hwnddlg],ID_HEX
  3.         stdcall SubclassWindow,eax,EditWindowProc
  4.  
  5.         ; Субклассировать кнопку
  6.         invoke  GetDlgItem,[hwnddlg],ID_BTN
  7.         stdcall SubclassWindow,eax,ButtonProc
Нечасто, но может возникнуть ситуация, когда надо отменить субклассирование какого-либо элемента диалогового окна. Не проблема, есть и для этого своя функция.
  1. ;-------------------------------------------------------------------------
  2. ; Функция снятия субклассирования с окна
  3. ;-------------------------------------------------------------------------
  4. ;  hWnd - хэндл окна
  5. ;-------------------------------------------------------------------------
  6. proc UnSubclassWindow hWnd:DWORD
  7.         pusha
  8.  
  9.         ; Получить сохраненный обработчик окна
  10.         invoke  GetProp,[hWnd],szOld
  11.         or      eax,eax
  12.         ; Сохраненного обработчика нет
  13.         jz      .loc_ret
  14.         ; Назначить окну старую функцию обработки
  15.         invoke  SetWindowLong,[hWnd],GWL_WNDPROC,eax
  16.         ; Удалить сохраненные обработчики
  17.         invoke  RemoveProp,[hWnd],szOld
  18.         invoke  RemoveProp,[hWnd],szNew
  19. .loc_ret:
  20.         popa
  21.         ret
  22. endp
Здесь проверяется наличие сохраненного обработчика, если он есть, то обработчик окна восстанавливается на исходный, после чего сохраненные значения очищаются.

Читать статью целиком »
Просмотров: 345 | Комментариев: 0

Окно с возможностью клика сквозь него

15.11.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter

Окно с возможностью клика сквозь него

Некоторые улучшайзеры интерфейсов типа Actual Window Manager позволяют накладывать на окна так называемый эффект "призрачности". В этом режиме окно продолжает отображаться на экране, но все клики мышкой на области окна проходят сквозь него, как будто окна вовсе нет. Давайте разберем, как это делается. А для большего эффекта "призрачное" окно можно сделать полупрозрачным.

Читать статью целиком »
Просмотров: 480 | Комментариев: 0

Программное выключение нескольких мониторов

04.11.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter

Программное выключение нескольких мониторов

На технических форумах в этих ваших интернетах периодически поднимается тема о программном выключении мониторов. Предлагаются разные решения, чаще всего просто бездумно скопированные с других сайтов или более-менее адаптированные под требуемый язык программирования. В свое время я тоже делал что-то подобное. Сегодня хотелось бы провести глобальную работу над ошибками и выдать "на гора" действительно правильное и рабочее решение этой задачи. Заодно я постараюсь подробно рассказать, что не так с другими предлагаемыми решениями.

Читать статью целиком »
Просмотров: 1052 | Комментариев: 45

prev 01 02 03 04 05 06 07 08 09 ... 37 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2020
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0018 сек.) / Память: 5 Mb
Наверх