Как получить хэндл дочернего окна через WinAPI

Простейшие вопросы в области инженерной разработки

Как получить хэндл дочернего окна через WinAPI

Postby Igor_G on 19 Mar 2017, 14:44

Добрый день коллеги,
подскажите как получить String хэндл (хэндл дочернего окна) в SubVI через WinAPI (Окно будет одно единственное в SubVI. Поэтому согласно dadreamer должно работать).
Первый шаг понятен - вызываю FindWindow и получаю хэндл SubVI. А дальше к сожелению не понимаю.
Attachments
String Handle.png
Igor_G
assistant
assistant
 
Posts: 122
Joined: 06 Nov 2011, 14:10
LabVIEW Version: 2012-2015
Karma: 0

Re: Как получить хэндл дочернего окна через WinAPI

Postby dadreamer on 19 Mar 2017, 15:06

FindWindow лучше не использовать, т.к. эта функция ищет окно по заголовку. Если заголовка нет или он совпадает с каким-то другим заголовком, то получите не тот результат, что хотели. В :labview: давно имеется приватный Property Node - FP.NativeWindow (см. тему https://lavag.org/topic/13803-getting-t ... title-bar/ , пост JackDunaway). Куда поместите FP.NativeWindow, тот хэндл и получите (SubVI или основной VI).

А почему вы собираетесь получить хэндл в виде строки? Он вообще-то имеет тип Unsigned Pointer Sized Integer, т.е. U64 в 64-битной среде и U32 в 32-битной.

И что в итоге хотите сделать с этим хэндлом? Может, всё намного проще и с Windows API не надо возиться.
User avatar
dadreamer
doctor
doctor
 
Posts: 2777
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Как получить хэндл дочернего окна через WinAPI

Postby Igor_G on 19 Mar 2017, 15:43

Проблема в том что Property Node запрещают работу SubVI в Inline => работа SubVI катастрофически замедляется.
Ну не знаю я как заставить VI работать быстро и использовать Property Node. Поэтому и решил работать с WinAPI (будет работать точно очень быстро).

Через хэндл я хочу делать окраску частей техта в String. Пример показывает мою проблему.
Attachments
1_2_3.png
Igor_G
assistant
assistant
 
Posts: 122
Joined: 06 Nov 2011, 14:10
LabVIEW Version: 2012-2015
Karma: 0

Re: Как получить хэндл дочернего окна через WinAPI

Postby dadreamer on 19 Mar 2017, 16:03

Igor_G wrote:Проблема в том что Property Node запрещают работу SubVI в Inline => работа SubVI катастрофически замедляется.

Тут скорее дело в том, что большинство (процентов 90) Property/Invoke Nodes работает в UI потоке, а он один на всё приложение. Но да, указанное свойство нельзя использовать в инлайн-сабВИ.
Igor_G wrote:Поэтому и решил работать с WinAPI (будет работать точно очень быстро).

Указывайте тогда и класс окна, чтобы минимизировать вероятность ложных результатов. Заголовок также можно сделать если не уникальным, то хотя бы оригинальным для вашего приложения.
Igor_G wrote:Через хэндл я хочу делать окраску частей техта в String. Пример показывает мою проблему.

Честно, не понимаю, какое отношение имеет hwnd окна к стринг контролу (индикатору). Как вы собрались раскрашивать контрол (индикатор) с помощью этого хэндла?
User avatar
dadreamer
doctor
doctor
 
Posts: 2777
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Как получить хэндл дочернего окна через WinAPI

Postby Igor_G on 19 Mar 2017, 19:37

С точки зрения WinAPI все (или почти все имет хэндл). Мне нужно получить хэндл стринг индикатора.
NI говорит что это возможно узнать тоже через WinAPI но не говорит как. :o(

Через хэндл стринг индикатора я могу делать окраску техта в String индикаторе с помощью WinAPI и это будет работать в inline.
Igor_G
assistant
assistant
 
Posts: 122
Joined: 06 Nov 2011, 14:10
LabVIEW Version: 2012-2015
Karma: 0

Re: Как получить хэндл дочернего окна через WinAPI

Postby dadreamer on 20 Mar 2017, 03:50

Igor_G wrote:С точки зрения WinAPI все (или почти все имет хэндл).

Смотря какой. HWND - это только окошки.
Igor_G wrote:Мне нужно получить хэндл стринг индикатора.

Не получите. Ибо у него его нет. Image
Igor_G wrote:NI говорит что это возможно узнать тоже через WinAPI но не говорит как. :o(

Бред, у объектов на FP нет никаких хэндлов, иначе было бы невозможно обеспечить кросс-платформенность. WinSpy тоже не в силах что-то показать. Пруф, если уверены в обратном.
Igor_G wrote:Через хэндл стринг индикатора я могу делать окраску техта в String индикаторе с помощью WinAPI и это будет работать в inline.

А пока - удачи в реализации решения. :wink:

З.Ы.: а всё-таки, выполнять работу с GUI во времякритичных подпрограммах - не есть хорошо.
User avatar
dadreamer
doctor
doctor
 
Posts: 2777
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Как получить хэндл дочернего окна через WinAPI

Postby Igor_G on 21 Mar 2017, 00:38

Смотря какой. HWND - это только окошки.

Извините, но позвольте с Вами не согласится. Читаем внимательно отсканированную стр. 14.

Не получите. Ибо у него его нет.
и
Бред, у объектов на FP нет никаких хэндлов, иначе было бы невозможно обеспечить кросс-платформенность. WinSpy тоже не в силах что-то показать. Пруф, если уверены в обратном.

Kросс-платформенность обеспечивается потому-что Чарльз Симонаи был далеко не глупым человеком - (см. отсканированную стр. 4).

На этом академическую перепалку хотелось бы закончить и вернуться к начальному вопросу.

КАК ОПРЕДЕЛИТь ХЭНДЕЛ ЭЛЕМЕНТА НА FP?
То что это возможно - это факт. Это мне ответил NI Support и дал линк на эту страницу. Это-же я читал где то в LAVA (к сожалению найти сегодня линк больше не могу).
Не уже ли ни у кого нет идей? Не ужели это на самом деле ни кто не пробовал?
Attachments
Str-4-5.pdf
стр. 4
(1.15 MiB) Downloaded 19 times
Str-14-15.pdf
стр. 14
(1.21 MiB) Downloaded 17 times
Igor_G
assistant
assistant
 
Posts: 122
Joined: 06 Nov 2011, 14:10
LabVIEW Version: 2012-2015
Karma: 0

Re: Как получить хэндл дочернего окна через WinAPI

Postby Vitekkz88 on 21 Mar 2017, 11:37

"В windows хэндлы присваиваются чему угодно: окно, меню, иконка, курсор и т.д. Фактически хэндл - это указатель на блок памяти".
Из этого предложения следует понять, что кругом окна. Коль окно - получай хэндл. А если не окно, то хэндл не получай. Конечно же для стороннего приложения так же выделяется память и создаётся хендл. Но дальше начинается шаманство с адресными картами на элементы приложения(в том числе и на элементы GUI). И если вся гуйня сделана на виндовс майкросфтовских компонентах - то конечно же всё будет гут и WinSpy покажет ху из ху. Вон, в интернетах до сих пор гуляет пример с калькулятором. Там всюду окна.
А теперь переходим к LabVIEW:
Компоненты GUI лабвьюшные нифига не окна. Поэтому через WinSpy ничего мы не видим. Резонный вопрос: а как тогда автоматизировать тестирование GUI LabVIEW? Для этого существуют сторонние инструменты, которые как-то там ходят в приложение и дёргают указатели на кнопки(а может и не указатели). И там определенно не чистое WinAPI. Другое дело Activex/.net-control-объекты, они являются особо приближенными к его величество - императору. Ну и палитру "System" можно попробовать пощупать, маловероятно конечно, ну а вдруг? :)
NI Support вас отфутболил прост, а Вы и не поняли :D Попробуйте копать в сторону "hwnd элемента управления" и поглубже, а не только там где в тэгах присутствует слово "LabVIEW".
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 909
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 250
hardware I/O VIP

Re: Как получить хэндл дочернего окна через WinAPI

Postby dadreamer on 21 Mar 2017, 17:44

Igor_G wrote:Извините, но позвольте с Вами не согласится. Читаем внимательно отсканированную стр. 14.

Интересно, с чем именно вы не согласились? :D Я всё корректно написал. Ещё раз:
dadreamer wrote:Смотря какой. HWND - это только окошки.

То, что в Windows хэндлы повсеместно используются, совсем не секрет для сколь-нибудь продвинутого юзера. И это никто не отрицал ни разу. А вот тип хэндла HWND управляет только окнами. Цитата отсюда:
Window Handles

Windows are objects — they have both code and data — but they are not C++ classes. Instead, a program references a window by using a value called a handle. A handle is an opaque type. Essentially, it is just a number that the operating system uses to identify an object. You can picture Windows as having a big table of all the windows that have been created. It uses this table to look up windows by their handles. (Whether that's exactly how it works internally is not important.) The data type for window handles is HWND, which is usually pronounced "aitch-wind." Window handles are returned by the functions that create windows: CreateWindow and CreateWindowEx.

Цитата отсюда:
So, a HWND is a HANDLE, but not all HANDLEs are HWND. In fact:

typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;

A "handle" is the general term used to refer to a token that identifies a resource on the system (a menu, a DLL module, a block of memory, etc). Often referred to as a "magic cookie", it's normally returned when you first create the resource. You then pass that handle to other functions in the API responsible for processing the resource. You normally need not know what the handle is however. Sometimes it may be a pointer, other times a number, perhaps a structure, or whatever. That's why they hide it using names like HWND which is simply the handle used to identify a window (returned by the API function "CreateWindow()").

И таких цитат можно тысячу набрать, при желании, ибо это прописные истины.
Кстати, на этих страницах книги ни слова о хэндлах вида magic cookie. Между прочим, такие хэндлы не обязательно должны быть сопоставлены с каким-либо объектом в памяти (могут и не быть).
Igor_G wrote:Kросс-платформенность обеспечивается потому-что Чарльз Симонаи был далеко не глупым человеком - (см. отсканированную стр. 4).

Какое отношение имеет этот Чарльз Симонаи к кросс-платформенности :labview: ? :shok:
Цитата из вашей же книжки:
В любой книге, посвященной программированию под Windows, вы найдете упоминание о том, что один из первых разра­ботчиков Windows Чарльз Симонаи, венгр по происхождению, начал использовать в своих программах способ именования переменных, кото­рый впоследствии назвали венгерской системой.

Ну, и как это понимать? :dntknw: Погуглите, что такое кросс-платформенность. И что нужно сделать при написании программы (особенно такой как :labview: ), чтобы её добиться.
КАК ОПРЕДЕЛИТь ХЭНДЕЛ ЭЛЕМЕНТА НА FP?
То что это возможно - это факт.
Это мне ответил NI Support и дал линк на эту страницу. Это-же я читал где то в LAVA (к сожалению найти сегодня линк больше не могу).

Повторяю - у объектов на FP хэндлов нет! Не верите мне и Vitekkz88 - вот слова Rolf Kalbermatter, съевшего собаку на этих вещах (1, 2):
As Chaos said, you simply can't do that. All the front panel objects in LabVIEW are actually LabVIEW objects and absolutely NOT based on Windows standard controls. So there is no Windows HWND associated with them at all.

You can't get a HWND from a LabVIEW control. They are not implemented as Windows child window but are instead entirely handled by LabVIEW internally. The only thing in LabVIEW that has an associated Windows handle are the panels itself.

Если и этого мало - возьмите WinSpy или встроенный в LV Window Monitor и смотрите, какие хэндлы возвращаются.
А NI просто вам кинули ссыль на врапперы (причём, уже устаревшие) на некоторые функции WinAPI - типа, "сами там возитесь с вашими нам непонятными задачами" :crazy:
Igor_G wrote:Не уже ли ни у кого нет идей? Не ужели это на самом деле ни кто не пробовал?

А зачем кому-то это вообще может понадобиться? Между прочим, вам уже была дана подсказка:
dadreamer wrote:а всё-таки, выполнять работу с GUI во времякритичных подпрограммах - не есть хорошо.

Однако вы её не увидели. Или не захотели. Опять пытаетесь войти в дом, не как все люди, а через чердак. Сколько у вас подобных тем уже было?.. То компилятор :labview: оптимизировать собирались, то переделать существующие :vi: для работы с файлами... Сплошь фантастика! :D
В вашем случае достаточно было бы вынести работу с гуями в отдельный поток и синхронизироваться через очереди/уведомители. Примеров на форуме полно. Другим, пожалуй более экзотическим решением, было бы написать весь GUI в другой среде и оформить в виде библиотеки. Тогда бы вы получили независимость потока обработки от UI потока (DLL реентерентная, естественно). Ну, хотите, продолжайте микроскопом гвозди забивать - ваше дело.
User avatar
dadreamer
doctor
doctor
 
Posts: 2777
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet


Return to Для чайников

Who is online

Users browsing this forum: Baidu and 9 guests

cron