Добрый день коллеги,
подскажите как получить String хэндл (хэндл дочернего окна) в SubVI через WinAPI (Окно будет одно единственное в SubVI. Поэтому согласно dadreamer должно работать).
Первый шаг понятен - вызываю FindWindow и получаю хэндл SubVI. А дальше к сожелению не понимаю.
Как получить хэндл дочернего окна через WinAPI
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Как получить хэндл дочернего окна через WinAPI
FindWindow лучше не использовать, т.к. эта функция ищет окно по заголовку. Если заголовка нет или он совпадает с каким-то другим заголовком, то получите не тот результат, что хотели. В давно имеется приватный 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 не надо возиться.
А почему вы собираетесь получить хэндл в виде строки? Он вообще-то имеет тип Unsigned Pointer Sized Integer, т.е. U64 в 64-битной среде и U32 в 32-битной.
И что в итоге хотите сделать с этим хэндлом? Может, всё намного проще и с Windows API не надо возиться.
-
- assistant
- Сообщения: 126
- Зарегистрирован: 06 ноя 2011, 14:10
- Версия LabVIEW: 2012-2016
- Контактная информация:
Re: Как получить хэндл дочернего окна через WinAPI
Проблема в том что Property Node запрещают работу SubVI в Inline => работа SubVI катастрофически замедляется.
Ну не знаю я как заставить VI работать быстро и использовать Property Node. Поэтому и решил работать с WinAPI (будет работать точно очень быстро).
Через хэндл я хочу делать окраску частей техта в String. Пример показывает мою проблему.
Ну не знаю я как заставить VI работать быстро и использовать Property Node. Поэтому и решил работать с WinAPI (будет работать точно очень быстро).
Через хэндл я хочу делать окраску частей техта в String. Пример показывает мою проблему.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Как получить хэндл дочернего окна через WinAPI
Тут скорее дело в том, что большинство (процентов 90) Property/Invoke Nodes работает в UI потоке, а он один на всё приложение. Но да, указанное свойство нельзя использовать в инлайн-сабВИ.Igor_G писал(а):Проблема в том что Property Node запрещают работу SubVI в Inline => работа SubVI катастрофически замедляется.
Указывайте тогда и класс окна, чтобы минимизировать вероятность ложных результатов. Заголовок также можно сделать если не уникальным, то хотя бы оригинальным для вашего приложения.Igor_G писал(а):Поэтому и решил работать с WinAPI (будет работать точно очень быстро).
Честно, не понимаю, какое отношение имеет hwnd окна к стринг контролу (индикатору). Как вы собрались раскрашивать контрол (индикатор) с помощью этого хэндла?Igor_G писал(а):Через хэндл я хочу делать окраску частей техта в String. Пример показывает мою проблему.
-
- assistant
- Сообщения: 126
- Зарегистрирован: 06 ноя 2011, 14:10
- Версия LabVIEW: 2012-2016
- Контактная информация:
Re: Как получить хэндл дочернего окна через WinAPI
С точки зрения WinAPI все (или почти все имет хэндл). Мне нужно получить хэндл стринг индикатора.
NI говорит что это возможно узнать тоже через WinAPI но не говорит как. :o(
Через хэндл стринг индикатора я могу делать окраску техта в String индикаторе с помощью WinAPI и это будет работать в inline.
NI говорит что это возможно узнать тоже через WinAPI но не говорит как. :o(
Через хэндл стринг индикатора я могу делать окраску техта в String индикаторе с помощью WinAPI и это будет работать в inline.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Как получить хэндл дочернего окна через WinAPI
Смотря какой. HWND - это только окошки.Igor_G писал(а):С точки зрения WinAPI все (или почти все имет хэндл).
Не получите. Ибо у него его нет.Igor_G писал(а):Мне нужно получить хэндл стринг индикатора.
Бред, у объектов на FP нет никаких хэндлов, иначе было бы невозможно обеспечить кросс-платформенность. WinSpy тоже не в силах что-то показать. Пруф, если уверены в обратном.Igor_G писал(а):NI говорит что это возможно узнать тоже через WinAPI но не говорит как. :o(
А пока - удачи в реализации решения.Igor_G писал(а):Через хэндл стринг индикатора я могу делать окраску техта в String индикаторе с помощью WinAPI и это будет работать в inline.
З.Ы.: а всё-таки, выполнять работу с GUI во времякритичных подпрограммах - не есть хорошо.
-
- assistant
- Сообщения: 126
- Зарегистрирован: 06 ноя 2011, 14:10
- Версия LabVIEW: 2012-2016
- Контактная информация:
Re: Как получить хэндл дочернего окна через WinAPI
Извините, но позвольте с Вами не согласится. Читаем внимательно отсканированную стр. 14.Смотря какой. HWND - это только окошки.
иНе получите. Ибо у него его нет.
Kросс-платформенность обеспечивается потому-что Чарльз Симонаи был далеко не глупым человеком - (см. отсканированную стр. 4).Бред, у объектов на FP нет никаких хэндлов, иначе было бы невозможно обеспечить кросс-платформенность. WinSpy тоже не в силах что-то показать. Пруф, если уверены в обратном.
На этом академическую перепалку хотелось бы закончить и вернуться к начальному вопросу.
КАК ОПРЕДЕЛИТь ХЭНДЕЛ ЭЛЕМЕНТА НА FP?
То что это возможно - это факт. Это мне ответил NI Support и дал линк на эту страницу. Это-же я читал где то в LAVA (к сожалению найти сегодня линк больше не могу).
Не уже ли ни у кого нет идей? Не ужели это на самом деле ни кто не пробовал?
- Вложения
-
- Str-4-5.pdf
- стр. 4
- (1.15 МБ) 97 скачиваний
-
- Str-14-15.pdf
- стр. 14
- (1.21 МБ) 105 скачиваний
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Как получить хэндл дочернего окна через WinAPI
"В windows хэндлы присваиваются чему угодно: окно, меню, иконка, курсор и т.д. Фактически хэндл - это указатель на блок памяти".
Из этого предложения следует понять, что кругом окна. Коль окно - получай хэндл. А если не окно, то хэндл не получай. Конечно же для стороннего приложения так же выделяется память и создаётся хендл. Но дальше начинается шаманство с адресными картами на элементы приложения(в том числе и на элементы GUI). И если вся гуйня сделана на виндовс майкросфтовских компонентах - то конечно же всё будет гут и WinSpy покажет ху из ху. Вон, в интернетах до сих пор гуляет пример с калькулятором. Там всюду окна.
А теперь переходим к LabVIEW:
Компоненты GUI лабвьюшные нифига не окна. Поэтому через WinSpy ничего мы не видим. Резонный вопрос: а как тогда автоматизировать тестирование GUI LabVIEW? Для этого существуют сторонние инструменты, которые как-то там ходят в приложение и дёргают указатели на кнопки(а может и не указатели). И там определенно не чистое WinAPI. Другое дело Activex/.net-control-объекты, они являются особо приближенными к его величество - императору. Ну и палитру "System" можно попробовать пощупать, маловероятно конечно, ну а вдруг? :)
NI Support вас отфутболил прост, а Вы и не поняли Попробуйте копать в сторону "hwnd элемента управления" и поглубже, а не только там где в тэгах присутствует слово "LabVIEW".
Из этого предложения следует понять, что кругом окна. Коль окно - получай хэндл. А если не окно, то хэндл не получай. Конечно же для стороннего приложения так же выделяется память и создаётся хендл. Но дальше начинается шаманство с адресными картами на элементы приложения(в том числе и на элементы GUI). И если вся гуйня сделана на виндовс майкросфтовских компонентах - то конечно же всё будет гут и WinSpy покажет ху из ху. Вон, в интернетах до сих пор гуляет пример с калькулятором. Там всюду окна.
А теперь переходим к LabVIEW:
Компоненты GUI лабвьюшные нифига не окна. Поэтому через WinSpy ничего мы не видим. Резонный вопрос: а как тогда автоматизировать тестирование GUI LabVIEW? Для этого существуют сторонние инструменты, которые как-то там ходят в приложение и дёргают указатели на кнопки(а может и не указатели). И там определенно не чистое WinAPI. Другое дело Activex/.net-control-объекты, они являются особо приближенными к его величество - императору. Ну и палитру "System" можно попробовать пощупать, маловероятно конечно, ну а вдруг? :)
NI Support вас отфутболил прост, а Вы и не поняли Попробуйте копать в сторону "hwnd элемента управления" и поглубже, а не только там где в тэгах присутствует слово "LabVIEW".
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Как получить хэндл дочернего окна через WinAPI
Интересно, с чем именно вы не согласились? Я всё корректно написал. Ещё раз:Igor_G писал(а):Извините, но позвольте с Вами не согласится. Читаем внимательно отсканированную стр. 14.
То, что в Windows хэндлы повсеместно используются, совсем не секрет для сколь-нибудь продвинутого юзера. И это никто не отрицал ни разу. А вот тип хэндла HWND управляет только окнами. Цитата отсюда:dadreamer писал(а):Смотря какой. 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).
Цитата из вашей же книжки:
Ну, и как это понимать? Погуглите, что такое кросс-платформенность. И что нужно сделать при написании программы (особенно такой как ), чтобы её добиться.В любой книге, посвященной программированию под Windows, вы найдете упоминание о том, что один из первых разработчиков Windows Чарльз Симонаи, венгр по происхождению, начал использовать в своих программах способ именования переменных, который впоследствии назвали венгерской системой.
Повторяю - у объектов на FP хэндлов нет! Не верите мне и Vitekkz88 - вот слова Rolf Kalbermatter, съевшего собаку на этих вещах (1, 2):КАК ОПРЕДЕЛИТь ХЭНДЕЛ ЭЛЕМЕНТА НА FP?
То что это возможно - это факт. Это мне ответил NI Support и дал линк на эту страницу. Это-же я читал где то в LAVA (к сожалению найти сегодня линк больше не могу).
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.
Если и этого мало - возьмите WinSpy или встроенный в LV Window Monitor и смотрите, какие хэндлы возвращаются.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.
А NI просто вам кинули ссыль на врапперы (причём, уже устаревшие) на некоторые функции WinAPI - типа, "сами там возитесь с вашими нам непонятными задачами"
А зачем кому-то это вообще может понадобиться? Между прочим, вам уже была дана подсказка:Igor_G писал(а):Не уже ли ни у кого нет идей? Не ужели это на самом деле ни кто не пробовал?
Однако вы её не увидели. Или не захотели. Опять пытаетесь войти в дом, не как все люди, а через чердак. Сколько у вас подобных тем уже было?.. То компилятор оптимизировать собирались, то переделать существующие для работы с файлами... Сплошь фантастика!dadreamer писал(а):а всё-таки, выполнять работу с GUI во времякритичных подпрограммах - не есть хорошо.
В вашем случае достаточно было бы вынести работу с гуями в отдельный поток и синхронизироваться через очереди/уведомители. Примеров на форуме полно. Другим, пожалуй более экзотическим решением, было бы написать весь GUI в другой среде и оформить в виде библиотеки. Тогда бы вы получили независимость потока обработки от UI потока (DLL реентерентная, естественно). Ну, хотите, продолжайте микроскопом гвозди забивать - ваше дело.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 7 Ответы
- 356 Просмотры
-
Последнее сообщение PAG