Страница 1 из 1

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

Добавлено: 10 Май 2006, 4:57
Admin
Вот такой вопрос возник:
Как получить THREAD CLARION окна зная его HWND ?
Желательно документированную функцию :)

Заранее благодарю за ответ!

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

Добавлено: 10 Май 2006, 16:44
Andrew™
Admin писал(а):Вот такой вопрос возник:
Как получить THREAD CLARION окна зная его HWND ?
Желательно документированную функцию :)

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

tmp &WINDOW

STOP(tmp{PROP:THREAD})

если в этом месте нету данного указателя, так сделай чтобы был

Добавлено: 10 Май 2006, 16:59
Admin
В хуке я знаю только Handle окна :) ...

Добавлено: 11 Май 2006, 11:45
Andrew Listiev
Если приложение твое(соответственно и окна :D), можно сохранять хендлы в очереди после открытия окна. Соответственно после детекции хендла, осуществлять поиск по очереди.

Добавлено: 11 Май 2006, 12:10
Andrew Listiev
Порылся в c60runx.dll и наткнулся на одну интересную функцию - Wsl$Hwnd2Screen. Может оно??? :wink:

Добавлено: 12 Май 2006, 2:41
Олег
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-цикл и ждать там ответа. Естественно, следует контролировать время ожидания и после истечения заданного интервала выходим из этой процедуры с кодом, что окно недоступно.

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

Удачи!

Добавлено: 15 Май 2006, 9:47
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)