в связи с
Цитата: АЛьФ от 24 апреля 2024, 15:39Цитата: Arbuz от 24 апреля 2024, 15:382) Когда окно сообщений парковано и размер уменьшен до предела (грубо, до одной строки), то оно находится в каком-то особом состоянии (без полосы прокрутки, без возможности выделения). Можно ли как-то ловить события клик или двойной клик на нём? ПриДвойномКликеВОкнеСообщений() не срабатывает когда оно в таком состоянии.
2. Нельзя.
тогда более глобальная хотелка: можно ли в событиях ПриНажатии(Отжатии)Левой(Правой)Кнопки() получать hwnd и ClassName окна под курсором?
Цитата: Arbuz от 24 апреля 2024, 16:02в связи с
Цитата: АЛьФ от 24 апреля 2024, 15:39Цитата: Arbuz от 24 апреля 2024, 15:382) Когда окно сообщений парковано и размер уменьшен до предела (грубо, до одной строки), то оно находится в каком-то особом состоянии (без полосы прокрутки, без возможности выделения). Можно ли как-то ловить события клик или двойной клик на нём? ПриДвойномКликеВОкнеСообщений() не срабатывает когда оно в таком состоянии.
2. Нельзя.
тогда более глобальная хотелка: можно ли в событиях ПриНажатии(Отжатии)Левой(Правой)Кнопки() получать hwnd и ClassName окна под курсором?
Посмотрю.
Может быть просто отдельный метод Сервису для получения текущих координат курсора и хендла и класса окна, без событий?
Цитата: Arbuz от 24 апреля 2024, 16:23Может быть просто отдельный метод Сервису для получения текущих координат курсора и хендла и класса окна, без событий?
Тут главный вопрос - где остановиться. Очевидно ведь захочется еще и родителя получать по хэндлу, как минимум.
Собственно, я всё больше склоняюсь к мысли, что хотелось бы просто метод к Сервису, который возвращал бы текущие:
(1) координаты курсора, и всё равно же в формексе в глобальной ПриДвиженииМыши() координаты пересчитываются относительно окна приложения, а в локальной — относительно окна формы, то какой-нибудь флаг для получения локальных/глобальных координат;
(2) дескриптор окна под ним;
(3) класс этого окна;
(4) дескриптор окна родительской формы, как в РасширениеФормы.Дескриптор
Накидал простенький вариант без пересчёта координат и без перебора родительских окон на DWX
Перем ScrptCtrl;
Перем Таймер1;
Процедура ПриОткрытии()
ScrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
ScrptCtrl.Language = "vbscript";
ScrptCtrl.TimeOut = -1;
ТекстМодуля = "
|Public Const HEAP_ZERO_MEMORY = &h00000008
|";
ТекстМодуля = ТекстМодуля + "
| Dim Wrap
| Dim hHeap
| Dim pClassName
| Dim pRECT
|
|Public Sub Init
| Set Wrap = CreateObject(""DynamicWrapperX"")
| Wrap.Register ""kernel32"", ""HeapAlloc"", ""i=lll"", ""r=l""
| Wrap.Register ""Kernel32"", ""HeapFree"", ""i=lll"", ""r=l""
| Wrap.Register ""kernel32"", ""GetProcessHeap"", ""r=l""
| Wrap.Register ""user32"", ""WindowFromPhysicalPoint"", ""i=ll"", ""r=h""
| Wrap.Register ""user32"", ""GetParent"", ""i=h"", ""r=h""
| Wrap.Register ""user32"", ""GetClassName"" , ""i=hpl"", ""r=l""
| Wrap.Register ""user32"", ""GetCursorPos"" , ""i=p"", ""r=l""
|
| hHeap = Wrap.GetProcessHeap()
| pClassName = Wrap.HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 256)
| pRECT = Wrap.HeapAlloc(hHeap, 0, 16)
|End Sub
|
|Public Function GetX()
| Wrap.GetCursorPos pRECT
| GetX = Wrap.NumGet(pRECT, 0)
|End Function
|
|Public Function GetY()
| Wrap.GetCursorPos pRECT
| GetY = Wrap.NumGet(pRECT, 4)
|End Function
|
|Public Function GethWnd()
| GethWnd = Wrap.WindowFromPhysicalPoint(GetX(), GetY())
|End Function
|Public Function GetClassName()
| Wrap.GetClassName GethWnd(), pClassName, 256
| GetClassName = Wrap.StrGet(pClassName, ""s"")
|End Function
|Public Function GetParent()
| GetParent = Wrap.GetParent(Wrap.WindowFromPhysicalPoint(GetX(), GetY()))
|End Function
|";
Попытка
ScrptCtrl.AddCode(ТекстМодуля);
Исключение
Message(ScrptCtrl.Error.Description);
Message(ScrptCtrl.Error.Source);
Message(ScrptCtrl.Error.Text);
КонецПопытки;
ScrptCtrl.Run("Init");
Сообщить(" X:" + ScrptCtrl.Run("GetX") +
" Y:" + ScrptCtrl.Run("GetY") +
" hWnd:" + ScrptCtrl.Run("GethWnd") +
" class:" + ScrptCtrl.Run("GetClassName") +
" parent:" + ScrptCtrl.Run("GetParent"));
Таймер1 = СоздатьОбъект("Таймер");
Таймер1.ЗадатьОбработчикВМодулеФормы(Контекст, "Сформировать");
Таймер1.Запустить(1000);
КонецПроцедуры
//======================================================================
Процедура Сформировать()
Сообщить(" X:" + ScrptCtrl.Run("GetX") +
" Y:" + ScrptCtrl.Run("GetY") +
" hWnd:" + ScrptCtrl.Run("GethWnd") +
" class:" + ScrptCtrl.Run("GetClassName") +
" parent:" + ScrptCtrl.Run("GetParent") );
КонецПроцедуры // Сформировать