Как получить Clarion тред окна по хэндлу?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Как получить Clarion тред окна по хэндлу?

Сообщение Admin »

Вот такой вопрос возник:
Как получить THREAD CLARION окна зная его HWND ?
Желательно документированную функцию :)

Заранее благодарю за ответ!
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Как получить Clarion тред окна по хэндлу?

Сообщение Andrew™ »

Admin писал(а):Вот такой вопрос возник:
Как получить THREAD CLARION окна зная его HWND ?
Желательно документированную функцию :)

Заранее благодарю за ответ!
если есть клашино окно то есть и &WINDOW
От него и пляши

tmp &WINDOW

STOP(tmp{PROP:THREAD})

если в этом месте нету данного указателя, так сделай чтобы был
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сообщение Admin »

В хуке я знаю только Handle окна :) ...
Аватара пользователя
Andrew Listiev
Активист
Сообщения: 166
Зарегистрирован: 07 Июль 2005, 11:16
Откуда: Латвия, Рига

Сообщение Andrew Listiev »

Если приложение твое(соответственно и окна :D), можно сохранять хендлы в очереди после открытия окна. Соответственно после детекции хендла, осуществлять поиск по очереди.
Аватара пользователя
Andrew Listiev
Активист
Сообщения: 166
Зарегистрирован: 07 Июль 2005, 11:16
Откуда: Латвия, Рига

Сообщение Andrew Listiev »

Порылся в c60runx.dll и наткнулся на одну интересную функцию - Wsl$Hwnd2Screen. Может оно??? :wink:
Аватара пользователя
Олег
Ветеран движения
Сообщения: 122
Зарегистрирован: 16 Июль 2005, 2:35
Откуда: Москва
Контактная информация:

Сообщение Олег »

Andrew Listiev писал(а):Порылся в c60runx.dll и наткнулся на одну интересную функцию - Wsl$Hwnd2Screen. Может оно??? :wink:
Угу, именно оно:

MAP
hWin2Win(LONG _hWin),*WINDOW,NAME('Wsl$Hwnd2Screen'),DLL(dll_mode)
END

WinRef &WINDOW

Code
WinRef &= hWin2Win(WinHandle)
WinThread# = WinRef{PROP:Thread}

Правда, есть один момент, который необходимо знать - эта функция просто посылает окну по его хендлу событие, на которое окно отвечает своим рефералом. Используется для этого функция SendMessage. Соответственно, если обработчик событий нужного окна по какой-либо причине недоступен, то вызов этой функции приведет к "мертвому" завису всей проги!
Поэтому, если есть хотя-бы малейшая вероятность недоступности нужного окна, то я бы посоветовал использовать стандартный для Винды и Клариона вариант с событиями. Но не через SendMessage, а через обычный POST.
В принципе, можно написать небольшую процедурку, в которой послать пользовательский запрос в нужное окно по его хендлу с помощью WinAPI-функции PostMessage. После чего войти в Accept-цикл и ждать там ответа. Естественно, следует контролировать время ожидания и после истечения заданного интервала выходим из этой процедуры с кодом, что окно недоступно.

Вообщем, как всегда дилема - или проще, но не очень надежно, или надежно, но сложнее!

Удачи!
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Admin писал(а):В хуке я знаю только Handle окна :) ...
смотря как реализовывать переопределённый обработчик, я уже писал на эту тему и рассказывал как переопределить обработчик так, что в качестве первого параметра будет идти не hWnd окна, а что нибудь другое, в моём случае адресс класса хука, а в нём есть и hWnd и &WINDOW

Код: Выделить всё

 SetWindowLong(SELF.W{PROP:HAndle},GWL_WNDPROC,ADDRESS(MyWindowProcedure))

!---------------------------------------------------------------------
!---------------------------------------------------------------------
MyWindowProcedure                       FUNCTION(ERSCStdThunk base, UNSIGNED uMsg, UNSIGNED wParam, LONG lParam)
        CODE
 RETURN base.ProcessMessage(base.Handle,uMsg,wParam,lParam)
Ответить