Хотелка: Получать hwnd и ClassName в событиях мыши

Автор Arbuz, 24 апреля 2024, 16:02

« назад - далее »

Arbuz

в связи с
Цитата: АЛьФ от 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

Может быть просто отдельный метод Сервису для получения текущих координат курсора и хендла и класса окна, без событий?

АЛьФ

Цитата: Arbuz от 24 апреля 2024, 16:23Может быть просто отдельный метод Сервису для получения текущих координат курсора и хендла и класса окна, без событий?
Тут главный вопрос - где остановиться. Очевидно ведь захочется еще и родителя получать по хэндлу, как минимум.

Arbuz

Собственно, я всё больше склоняюсь к мысли, что хотелось бы просто метод к Сервису, который возвращал бы текущие:
(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") ); 

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