Форум Кладовочки АЛьФ`а

Обсуждение проектов => FormEx => Тема начата: Arbuz от 24 апреля 2024, 16:02

Название: Хотелка: Получать hwnd и ClassName в событиях мыши
Отправлено: Arbuz от 24 апреля 2024, 16:02
в связи с
Цитата: АЛьФ от 24 апреля 2024, 15:39
Цитата: Arbuz от 24 апреля 2024, 15:382) Когда окно сообщений парковано и размер уменьшен до предела (грубо, до одной строки), то оно находится в каком-то особом состоянии (без полосы прокрутки, без возможности выделения). Можно ли как-то ловить события клик или двойной клик на нём? ПриДвойномКликеВОкнеСообщений() не срабатывает когда оно в таком состоянии.

2. Нельзя.

тогда более глобальная хотелка: можно ли в событиях ПриНажатии(Отжатии)Левой(Правой)Кнопки() получать hwnd и ClassName окна под курсором?
Название: Re: Хотелка: Получать hwnd и ClassName в событиях мыши
Отправлено: АЛьФ от 24 апреля 2024, 16:13
Цитата: Arbuz от 24 апреля 2024, 16:02в связи с
Цитата: АЛьФ от 24 апреля 2024, 15:39
Цитата: Arbuz от 24 апреля 2024, 15:382) Когда окно сообщений парковано и размер уменьшен до предела (грубо, до одной строки), то оно находится в каком-то особом состоянии (без полосы прокрутки, без возможности выделения). Можно ли как-то ловить события клик или двойной клик на нём? ПриДвойномКликеВОкнеСообщений() не срабатывает когда оно в таком состоянии.

2. Нельзя.

тогда более глобальная хотелка: можно ли в событиях ПриНажатии(Отжатии)Левой(Правой)Кнопки() получать hwnd и ClassName окна под курсором?

Посмотрю.
Название: Re: Хотелка: Получать hwnd и ClassName в событиях мыши
Отправлено: Arbuz от 24 апреля 2024, 16:23
Может быть просто отдельный метод Сервису для получения текущих координат курсора и хендла и класса окна, без событий?
Название: Re: Хотелка: Получать hwnd и ClassName в событиях мыши
Отправлено: АЛьФ от 24 апреля 2024, 16:45
Цитата: Arbuz от 24 апреля 2024, 16:23Может быть просто отдельный метод Сервису для получения текущих координат курсора и хендла и класса окна, без событий?
Тут главный вопрос - где остановиться. Очевидно ведь захочется еще и родителя получать по хэндлу, как минимум.
Название: Re: Хотелка: Получать hwnd и ClassName в событиях мыши
Отправлено: Arbuz от 03 мая 2024, 13:02
Собственно, я всё больше склоняюсь к мысли, что хотелось бы просто метод к Сервису, который возвращал бы текущие:
(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") );

КонецПроцедуры // Сформировать