Не совсем лабвьюшный вопрос (общий)

ActiveX, .NET, DLL
Ответить
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Не совсем лабвьюшный вопрос (общий)

Сообщение Sergey Ivanov »

Подскажите, пожалуйста, возможно ли задать начальное положение окна приложения, которое запускается через командную строку ?
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Vitekkz88

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

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение Vitekkz88 »

Sergey Ivanov 6 минут назад
Подскажите, пожалуйста, возможно ли задать начальное положение окна приложения, которое запускается через командную строку ?
Так понимаю,что в самом приложении этого сделать никак не получится?
Есть утилита - Cmdow. Она позволяет манипулировать окнами.
Гляньте,может подойдет.
http://old.computerra.ru/gid/rtfm/system/272855/
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение Sergey Ivanov »

То что надо. Спасибо большое !
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение Sergey Ivanov »

Только сейчас стал разбираться, но не пойму, как этой утилитой пользоваться.

Пробую так, но не получается
запукск.JPG
Утилита, на всякий случай:
cmdow-1.4.8.rar
(52.64 КБ) 255 скачиваний
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение Sergey Ivanov »

Всё, разобрался. Необходимо было cmdow.exe закинуть в папку Windows.

Теперь другой вопрос. Как манипулировать с окнами, имеющими русские буквы в названии ?
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение Sergey Ivanov »

Разобрался и с этим.
Вместо имени окна надо использовать шестнадцатеричный дескриптор окна
Это записываем в батник и оно начинает работать :dance:

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

cmdow 0x180144 /MOV 0 0
pause
0x180144 - дескриптор окна
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение Sergey Ivanov »

С дескриптором окна не получается. Он при каждом запуске меняется. А название окна содержит русские буквы. Что можно сделать ?
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
dadreamer

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

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение dadreamer »

Sergey Ivanov, а FindWindow использовать не получится? Можно для начала попробовать без указания класса. Но тут такое дело: если будет запущено приложение с окном, имеющим точно такое же название, может сработать неверно: вернёт не тот хэндл. Так что лучше ещё указать класс, его можно определить через WinSpy. Есть более сложный вариант. Используете для запуска программы это, потом листаете все окна с помощью EnumWindows() и GetWindowThreadProcessID(), сравниваете ID процесса с вашим ID, если совпало - то можно что-то делать с окном ( http://stackoverflow.com/questions/1888 ... process-id ). Честно говоря, мне это не очень нравится, но больше ничего на ум не приходит. :)
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение Sergey Ivanov »

Ваш способ хорош, наверно, но в нём надо разбираться.

Я решил сделать немного по-другому, попроще. Изменил кодировку.

Теперь батник с таким содержанием получается:

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

cmdow @ /HID
chcp 1251
cmdow "Микшер громкости - Динамики (Conexant SmartAudio HD)" /MOV 0 0
cmdow "Микшер громкости - Динамики (Conexant SmartAudio HD)" /REN "Изменить громкость"
скрываю окно
изменяю кодировку
присваиваю координаты верхнего левого угла окна микшера 0 по х, 0 по у
изменяю название окна
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
dadreamer

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

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение dadreamer »

[b][color=#FF9900]Sergey Ivanov[/color][/b] писал(а):

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

cmdow "Микшер громкости - Динамики (Conexant SmartAudio HD)" /MOV 0 0
А вы уверены, что при смене железа (материнка со встроенной звуковухой или отдельная звуковуха) у вас не изменится название окна? И как с этим делом на разных ОС?
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение Sergey Ivanov »

Название окна меняется.
Поэтому, смотрим как окно называется и вписываем нужное название. Пробовал на Win7 и Win8 работает и там и там.
Добро пожаловать на http://rk-stud.ru/
AlexanderKonoval
developer
developer
Сообщения: 257
Зарегистрирован: 03 янв 2014, 19:37
Версия LabVIEW: 2016
Откуда: Украина, Киев
Контактная информация:

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение AlexanderKonoval »

Для того, чтобы получить hWnd можно использовать библиотеку отсюда:
http://www.labviewportal.org/viewtopic. ... 1&start=45

чтобы получить имя нужного окна, можно использовать такую конструкцию, как на скрине (конструктор взят из библиотеки System 4.0.0)
Подаём имя процесса - профит.

это имя можно считывать с файла, чтобы сделать программу легко транспортируемой на другую систему.
Вложения
get_window_name.png
get_window_name.png (3.72 КБ) 11799 просмотров
колдооооовствооооо! (С)
Аватара пользователя
dadreamer

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

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение dadreamer »

AlexanderKonoval, это работает, если запущен один процесс с таким именем. Если больше, то может вернуть не тот хэндл. Ситуация маловероятная, конечно, но всё же. Так что в действительности самый надежный способ - запуск через ShellExecute и по хэндлу процесса получить окно. Пока не рассматриваю ситуацию, когда у процесса много окон, и какие у них взаимоотношения ("родитель" / "потомок", "собственник" и т.п.)
Аватара пользователя
dadreamer

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

Re: Не совсем лабвьюшный вопрос (общий)

Сообщение dadreamer »

Потратил несколько часов, всё-таки реализовав второй вариант. Попутно обнаружились некоторые подводные камни:
1. на XP sndvol32, на W7 sndvol (об этом вроде уже писали);
2. на XP класс окна Volume Control, на W7 #32770;
3. текст (заголовок) окна одного процесса может меняться (и иногда меняется), как ему захочется;
4. одних и тех же PID'ов одновременно может быть несколько, как правило, это дочерние окна одного процесса.
GetWin2011.vi
LV2011
(49.93 КБ) 272 скачивания
Вроде бы работает, как нужно. Если использовать для другого приложения, то нужно будет прописать класс окна, определяемый через WinSpy, например. Да, ещё массив там в конце надо проиндексировать по 0, чтобы кластер вытащить.

P.S.: за основу взят код отсюда.
Вложения
GetWin.cpp
исходник Get Windows
(2.82 КБ) 240 скачиваний
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приложениями»