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

Простейшие вопросы в области инженерной разработки
Ответить
Igor_G
assistant
assistant
Сообщения: 126
Зарегистрирован: 06 ноя 2011, 14:10
Версия LabVIEW: 2012-2016
Контактная информация:

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

Сообщение Igor_G »

Добрый день коллеги,
подскажите как получить String хэндл (хэндл дочернего окна) в SubVI через WinAPI (Окно будет одно единственное в SubVI. Поэтому согласно dadreamer должно работать).
Первый шаг понятен - вызываю FindWindow и получаю хэндл SubVI. А дальше к сожелению не понимаю.
Вложения
String Handle.png
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

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 не надо возиться.
Igor_G
assistant
assistant
Сообщения: 126
Зарегистрирован: 06 ноя 2011, 14:10
Версия LabVIEW: 2012-2016
Контактная информация:

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

Сообщение Igor_G »

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

Через хэндл я хочу делать окраску частей техта в String. Пример показывает мою проблему.
Вложения
1_2_3.png
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Igor_G писал(а):Проблема в том что Property Node запрещают работу SubVI в Inline => работа SubVI катастрофически замедляется.
Тут скорее дело в том, что большинство (процентов 90) Property/Invoke Nodes работает в UI потоке, а он один на всё приложение. Но да, указанное свойство нельзя использовать в инлайн-сабВИ.
Igor_G писал(а):Поэтому и решил работать с WinAPI (будет работать точно очень быстро).
Указывайте тогда и класс окна, чтобы минимизировать вероятность ложных результатов. Заголовок также можно сделать если не уникальным, то хотя бы оригинальным для вашего приложения.
Igor_G писал(а):Через хэндл я хочу делать окраску частей техта в String. Пример показывает мою проблему.
Честно, не понимаю, какое отношение имеет hwnd окна к стринг контролу (индикатору). Как вы собрались раскрашивать контрол (индикатор) с помощью этого хэндла?
Igor_G
assistant
assistant
Сообщения: 126
Зарегистрирован: 06 ноя 2011, 14:10
Версия LabVIEW: 2012-2016
Контактная информация:

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

Сообщение Igor_G »

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

Через хэндл стринг индикатора я могу делать окраску техта в String индикаторе с помощью WinAPI и это будет работать в inline.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Igor_G писал(а):С точки зрения WinAPI все (или почти все имет хэндл).
Смотря какой. HWND - это только окошки.
Igor_G писал(а):Мне нужно получить хэндл стринг индикатора.
Не получите. Ибо у него его нет. Изображение
Igor_G писал(а):NI говорит что это возможно узнать тоже через WinAPI но не говорит как. :o(
Бред, у объектов на FP нет никаких хэндлов, иначе было бы невозможно обеспечить кросс-платформенность. WinSpy тоже не в силах что-то показать. Пруф, если уверены в обратном.
Igor_G писал(а):Через хэндл стринг индикатора я могу делать окраску техта в String индикаторе с помощью WinAPI и это будет работать в inline.
А пока - удачи в реализации решения. :wink:

З.Ы.: а всё-таки, выполнять работу с GUI во времякритичных подпрограммах - не есть хорошо.
Igor_G
assistant
assistant
Сообщения: 126
Зарегистрирован: 06 ноя 2011, 14:10
Версия LabVIEW: 2012-2016
Контактная информация:

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

Сообщение Igor_G »

Смотря какой. HWND - это только окошки.
Извините, но позвольте с Вами не согласится. Читаем внимательно отсканированную стр. 14.
Не получите. Ибо у него его нет.
и
Бред, у объектов на FP нет никаких хэндлов, иначе было бы невозможно обеспечить кросс-платформенность. WinSpy тоже не в силах что-то показать. Пруф, если уверены в обратном.
Kросс-платформенность обеспечивается потому-что Чарльз Симонаи был далеко не глупым человеком - (см. отсканированную стр. 4).

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

КАК ОПРЕДЕЛИТь ХЭНДЕЛ ЭЛЕМЕНТА НА FP?
То что это возможно - это факт. Это мне ответил NI Support и дал линк на эту страницу. Это-же я читал где то в LAVA (к сожалению найти сегодня линк больше не могу).
Не уже ли ни у кого нет идей? Не ужели это на самом деле ни кто не пробовал?
Вложения
Str-4-5.pdf
стр. 4
(1.15 МБ) 96 скачиваний
Str-14-15.pdf
стр. 14
(1.21 МБ) 104 скачивания
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

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

Сообщение Vitekkz88 »

"В windows хэндлы присваиваются чему угодно: окно, меню, иконка, курсор и т.д. Фактически хэндл - это указатель на блок памяти".
Из этого предложения следует понять, что кругом окна. Коль окно - получай хэндл. А если не окно, то хэндл не получай. Конечно же для стороннего приложения так же выделяется память и создаётся хендл. Но дальше начинается шаманство с адресными картами на элементы приложения(в том числе и на элементы GUI). И если вся гуйня сделана на виндовс майкросфтовских компонентах - то конечно же всё будет гут и WinSpy покажет ху из ху. Вон, в интернетах до сих пор гуляет пример с калькулятором. Там всюду окна.
А теперь переходим к LabVIEW:
Компоненты GUI лабвьюшные нифига не окна. Поэтому через WinSpy ничего мы не видим. Резонный вопрос: а как тогда автоматизировать тестирование GUI LabVIEW? Для этого существуют сторонние инструменты, которые как-то там ходят в приложение и дёргают указатели на кнопки(а может и не указатели). И там определенно не чистое WinAPI. Другое дело Activex/.net-control-объекты, они являются особо приближенными к его величество - императору. Ну и палитру "System" можно попробовать пощупать, маловероятно конечно, ну а вдруг? :)
NI Support вас отфутболил прост, а Вы и не поняли :D Попробуйте копать в сторону "hwnd элемента управления" и поглубже, а не только там где в тэгах присутствует слово "LabVIEW".
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Igor_G писал(а):Извините, но позвольте с Вами не согласится. Читаем внимательно отсканированную стр. 14.
Интересно, с чем именно вы не согласились? :D Я всё корректно написал. Ещё раз:
dadreamer писал(а):Смотря какой. 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 писал(а):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 писал(а):Не уже ли ни у кого нет идей? Не ужели это на самом деле ни кто не пробовал?
А зачем кому-то это вообще может понадобиться? Между прочим, вам уже была дана подсказка:
dadreamer писал(а):а всё-таки, выполнять работу с GUI во времякритичных подпрограммах - не есть хорошо.
Однако вы её не увидели. Или не захотели. Опять пытаетесь войти в дом, не как все люди, а через чердак. Сколько у вас подобных тем уже было?.. То компилятор :labview: оптимизировать собирались, то переделать существующие :vi: для работы с файлами... Сплошь фантастика! :D
В вашем случае достаточно было бы вынести работу с гуями в отдельный поток и синхронизироваться через очереди/уведомители. Примеров на форуме полно. Другим, пожалуй более экзотическим решением, было бы написать весь GUI в другой среде и оформить в виде библиотеки. Тогда бы вы получили независимость потока обработки от UI потока (DLL реентерентная, естественно). Ну, хотите, продолжайте микроскопом гвозди забивать - ваше дело.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»