Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Понадобилось вот, по работе, программно узнать - верхнее окно в системе является ли дочерним по отношению к определенному уже открытому файлу (имя которого заранее известно) или относится к другому файлу/приложению.
Например, имеем открытый файл в программе Excel. Как узнать, что верхнее окно в системе (которое вызвал пользователь) относится именно к данному файлу (например, могут быть окна: "Формат ячеек", "Шрифт" и т.д., и т.п.)?
Попробовал мониторить дескрипторы плагином Петра (zmFunctions), оказалось, что дескрипторы окон совершенно разные (была мысль, что у дочерних окон есть общий префикс, в рамках одного приложения и одного открытого файла, и что этот префикс можно парсить и сравнивать с префиксом "родительского" окна). Не прокатило...
Добавлено (24 Июня 2017, 19:23) --------------------------------------------- -или как то так командной строке, строка:powershell.exe "Get-Process |where {$_.mainWindowTItle} |format-table id,name,mainwindowtitle -AutoSize"
Вот эти два параметра, возможно смогут помочь: Pid - идентификатор процесса, породившего данное окно Image - название процесса, породившего данное окно Но пока не знаю как их можно задействовать. Мне с плагином сподручнее. Но если не получится, то буду экспериментировать с этой утилитой, спасибо!
Цитатаmishem ()
Попробуй вот этот плагин.
Пока не получилось. Может что не так делаю? Запустил Excel, вызвал из него дополнительное окно, затем нажал кнопки 1 и 2 в демо-проекте (что шел с плагином Петра). В списке дочерних окон пусто:
Андрей, а ты не пробовал эту утилиту в действии? Я по описанию утилиты пока не могу понять, как получить в переменную эти параметры верхнего окна в системе:
Результатом использования cmdow.exe будет листинг, содержащий следующие восемь полей Handle - шестнадцатеричный дескриптор окна Lev - уровень окна Windows Pid - идентификатор процесса, породившего данное окно Window status - статус окна (активное, минимизированное, скрытое, развернутое и т.п.) Left, Top - координаты окна (выводятся только в случае использования ключей /F и /P) Width, Height - размер окна в пикселях (выводятся только в случае использования опций /F и /P) Image - название процесса, породившего данное окно Caption - название окна
Сам непробовал, по описанию-это всё будет в консоли,- ну а из консоли достать можно и "разложить по полочкам"
скачал,попробовал, как говорится" не всё так однозначно" Как работает эта утилита - вообще непонятно- мелькает окно-и всё.Хотя по описанию. должна быть возможность ввода команд.Ну да ладно- это можно решить скриптом(собственно что и сделал) набросал функцию, на выходе получаем все данные которыне эта утилита выдаёт. А так как она просто мелькает и нет возможности ввести команды- издатель её пишет что выдаёт инфу обо всех окнах. Вобщем до конца непонял... Вобщем о результатах- вверху получаем Handle, Lev,Pid и тд Вадим попробуй разбирайся. Что то если надо изменить или ещё чем помочь - помогу (полученые результаты пропарсить по статусу(status)(инфа там вверху) ну а потом окно уже искать--вобщем работать надо, пробовать.. В архиве утилита,проект наскору руку,и функция под утилиту.
Помучил утилитку. Прикольная, но то, что мне сейчас нужно не может. Мне нужно проверить - текущее верхнее окно в системе - это окно работы с конкретным файлом или уже с другим. Объясню зачем, может я не в том направлении копаю...
Нужно реализовать возможность разрешить пользователю в Excel работать только с одним файлом с заранее нам известным именем. Контролировать окна по названиям заголовков в данном случае затруднительно, поскольку в Excel могут быть вызваны разнообразные диалоговые окна, заранее узнать об именах которых нельзя (их слишком много и не известно какими пользователь воспользуется). Вот я и подумал, что, возможно, есть способ узнать о наличии или отсутствии связи верхнего окна с конкретным открытым файлом.
Утилита cmdow этого не может, она просто показывает идентификатор родительского процесса (Pid), но он одинаковый для всех файлов и диалоговых окон открытых в Excel в течение сессии запуска Excel.
Нужно реализовать возможность разрешить пользователю в Excel работать только с одним файлом с заранее нам известным именем.
Ты хочешь с помощью НБ запретить пользователю работать с файлами в другой программе? Это не возможно сделать.
Добавлено (25 Июня 2017, 21:18) ---------------------------------------------
ЦитатаВадим ()
Контролировать окна по названиям заголовков в данном случае затруднительно, поскольку в Excel могут быть вызваны разнообразные диалоговые окна,
Дело в том, что любая программа имеет как видимые, так и не видимые окна. И не известно в какой момент она откроет то или иное не видимое окно нужное ей для выполнения определенных задач.
Предположим что ты принудительно закроешь это окно, тем самым нарушив функционал программы.
Грубо говоря ты пытаешься написать вирус, сам того не понимая.
Если есть желание посмотреть сколько окон открыто при запуске у ексель, качни программу AnVir Task Manager. Установи режим детальной информации. Выбери на вкладке процессы ексель. Перейди ниже на вкладку Окна. И ты все поймешь, ты все увидишь сам... Не хочешь читать хелп?
Если есть желание посмотреть сколько окон открыто при запуске у ексель
Это и cmdow показывает, я насчитал почти 200 окон )).
Цитатаmishem ()
Это не возможно сделать.
Ну, у меня задача немного проще - дать возможность пользователю работать с одним файлом, не вмешиваясь в работу других программ. Так что это не вирус.
В проекте "браузер-поплавок" я это уже давно сделал, а именно серфинг в браузере удерживается в пределах указанного домена и программа (необушный браузер) оказывается всегда верхней в системе. Если пользователь пытается открыть что-то другое, то необушный браузер помещается наверх и все дела. Но теперь понадобилось, чтобы пользователь мог работать в Excel, но только в одном файле (не мог открывать другие), вот тут-то и случился пока затык )) Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
В проекте "браузер-поплавок" я это уже давно сделал
Это совсем другое. Ты сделал в своем приложении. Там, где можешь все контролировать.
Сейчас ты хочешь управлять другим приложением. В принципе с помощью плагина и именно для ексель это думаю вполне возможно сделать, но с помощью НБ - нет.
В принципе ексель всегда создает скрытый временный файл рядом с открываемым файлом. Допустим если все файлы находятся в одной папке или где то рядом где мы знаем что они могут находиться, то можно попробовать мониторить папку на появление нового скрытого файла. Как только он появился, значит был открыт другой файл.
Попробуй реестр просмотреть, вполне возможно что эксель может сохранять путь к последнему открытому файлу. Так же там может находится и весь список открытых файлов.
Ну как то так. Не циклись в одном направлении. Чем больше направлений, тем лучше. Ляжешь спать, сон приснится с правильным направлением. Как Менделееву. Не хочешь читать хелп?
можно попробовать мониторить папку на появление нового скрытого файла. Как только он появился, значит был открыт другой файл
Цитатаmishem ()
Попробуй реестр просмотреть
Спасибо за идеи!!! Попробую!!
Добавлено (25 Июня 2017, 22:02) ---------------------------------------------
ЦитатаAS3856 ()
мелькает окно-и всё
Если открыть командную строку через кнопку Пуск/Стандартные, то не мелькает (т.е. не закрывается сразу), но вывод удобнее делать в файл все равно.
Я делал так: cmdow.exe /T /F > log.txt
В итоге получил листинг в файл:
Код
Handle Lev Pid -Window status- Image Caption 0x9C00F92 1 63016 Res Act Ena Vis cmd Командная строка - cmdow.exe /T /F 0x04212C6 1 46736 Res Ina Ena Vis explorer V 0x00715E8 1 55852 Res Ina Ena Vis notepad 1.txt — Блокнот 0x09C0C50 1 51688 Res Ina Ena Vis NeoBook NeoBook 5 0x07C1046 1 28112 Max Ina Ena Vis firefox Проверить наличие связи верхнего окна с открытым файлом - Форум NeoBook - Mozilla Firefox
есть ещё метод - опять же с помощью vbs (написать функцию) но для этого прежде зарегистрировать библиотеку dynwrapx.dll ну а затем вызов функций Win 32 API.В принципе метод достаточно быстро можно реализовать. Можно почитать тут http://script-coding.com/forum/viewtopic.php?id=7811 и тут http://script-coding.com/dynwrapx.html. Но придётся установить и зарегить библиотеку на каждом компе где будет использована ваша программа -опять же делается легко одним нажатием кнопки из проекта необука есть также варианты на С и делфи- но в силу своей малограмотностьи я их нерассматриваю. Надо звать Петра
Добавлено (25 Июня 2017, 22:45) ---------------------------------------------
ЦитатаВадим ()
Если открыть командную строку через кнопку Пуск/Стандартные, то не мелькает (т.е. не закрывается сразу), но вывод удобнее делать в файл все равно.
пока нескопировал в C:\Windows\System32 так и продолжало мелькать.
Добавлено (25 Июня 2017, 23:02) --------------------------------------------- Вадим посмотри на плагин RACAutoIt3x. Мне кажется там есть то что ты ищешь . RAC_WinGetState получение параметров окна(существует,видимо,активно доступно.) Верхнее окно наверно и является активным, нижнее же получается неактивно.. Вобщем можно в эту сторону ковырнуть задачу..
И будет пусто, т.к. это - не дочернее окно, а ... В общем, попробуй просто "чудом в перьях" под названием zmFunctions (что-то там типа FindWindow было). Думаю будешь удивлен.
В принципе, можно отыскать любое окно (теоретически), но, так и не ясна задача.... Это судя по указанному выше скрину. Предположим(!) - окно нашли, а дальше-то что?
ЦитатаВадим ()
Например, имеем открытый файл в программе Excel. Как узнать, что верхнее окно в системе (которое вызвал пользователь) относится именно к данному файлу (например, могут быть окна: "Формат ячеек", "Шрифт" и т.д., и т.п.)?
Боюсь, никак. Только по заголовку окна (если там указано имя файла) и/или его классу. Можно отследить к какому процессу (приложению) принадлежит окно, но вот в каком именно окне какой-то программы отображен тот или иной конкретный документ, сильно сомневаюсь. Во всяком случае, на текущий момент. Хотя... Всякое бывает...
ЦитатаAS3856 ()
Вадим посмотри на плагин RACAutoIt3x
Гм... Если честно, то более бестолковый плагин (по самой своей сути) на мой взгляд придумать просто невозможно!. Делать чистой воды "враппер" (простой переходник) для весьма и весьма сомнительной с точки зрения качества библиотеки, когда ВСЕ (!) это можно было реализовать в самом плагине средствами Delphi..... Причем даже кодировать-то пришлось бы меньше.... Функционал-то ведь у этой библиотеки примитивнейший! Чем же надо было обкуриться, чтобы замутить такой поагин?
Это примерно то же самое как сделать плагин для NB для управления другим плагином, вместо того, чтобы управлять им прямо из NB. А еще точнее - создать механический манипулятор, чтобы держать вилку, вместо того, чтобы просто взять ее в руку.. Или еще, как говорят на Руси, украсть цистерну спирта, спирт продать, а деньги - пропить!
Ну граждане, ну извинятйте, ну бред же полнейший (плагин для AutoIt)! Не сочтите за грубость.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Проясню свою задумку. Цель проекта - обеспечить корректную сдачу экзамена (работу с тестом онлайн и файлом Excel оффлайн). Студенты приходят в компьютерный класс, садятся за компьютеры - перед ними уже открыт мой проект - необушный браузер (проект "Браузер-поплавок"). В браузере уже реализована возможность ходить только по ссылкам в пределах одного домена (университетский сервер тестирования онлайн). Кроме того, если студент открывает любую другую программу (файл), то Браузер-поплавок (обнаружив не разрешенный заголовок окна) оказывается сверху и тем самым не даёт мухлёвщику воспользоваться другими ресурсами на компьютере. Однако, в этом году, для сдачи экзамена понадобилось ещё разрешить пользователю работать с файлом Excel, в котором он должен решить задачу. Задач много и решить их можно по-разному, используя разные функции и, соответственно, вызывая разные диалоговые окна. Вот тут и случился у меня затык - мониторинг заголовков окон в прежнем виде не решает задачу.
ЦитатаAS3856 ()
пока не скопировал в C:\Windows\System32 так и продолжало мелькать.
Я поместил в папку C:\Windows
ЦитатаAS3856 ()
есть ещё метод - опять же с помощью vbs
Пока для меня это темный лес, к моему сожалению. За ссылки - спасибо!
Всё это, как и возможность получить дескриптор верхнего окна, есть в zmFunctions.
ЦитатаPeter ()
Можно отследить к какому процессу (приложению) принадлежит окно
Да, этот Pid и показывает утилита, которую Андрей нашел. Но, к сожалению, для всех открытых файлов этот идентификатор будет одинаковым.
ЦитатаPeter ()
что-то там типа FindWindow было
Да, очень полезная команда! Я в нескольких проектах использую ("Браузер-поплавок", "Chronometer" и др.)! Удобно, когда заранее знаешь заголовок и что далее делать. Как раз проект "Браузер-поплавок" и обновляю.
ЦитатаPeter ()
Только по заголовку окна (если там указано имя файла) и/или его классу.
Название класса ничего не даёт, очень уж их много. А вот по заголовку наверное можно все-таки попробовать обнаружить, то не принадлежность окна к файлу, а в принципе - открылся ли в Excel ещё один файл. Кажется это можно сделать. Попробую! Как предлагает mishem, попробовать другим способом мониторить факт открытия других файлов. Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
Ты можешь мониторить заголовок окна открытия нового документа который отображается для выбора документа. Можно мониторить по заголовку, у меня заголовок отображается типа "Лист Microsoft Office Excel.xlsx - Microsoft Excel", "Новый.xlsx - Microsoft Excel" и т.д. Т.е. в заголовке всегда присутствует "- Microsoft Excel" и перед ним название файла.
Если честно, я не понимаю саму проблему.
Добавлено (26 Июня 2017, 11:04) ---------------------------------------------
ЦитатаВадим ()
Смотрел, там нет подходящих функций.
Там есть подходящая функция, поиск окна по части заголовка. Команда в плагине Петра этого не умеет делать. В данном случае она тебе может помочь искать все открытые документы в ексель по части заголовка "- Microsoft Excel", а далее с помощью команд плагина Петра ты можешь определить к какому файлу относятся все открытые документы.
сейчас так и пробую сделать (только у меня заголовок не содержит слова Microsoft. Хорошо, что хоть у тебя это увидел - не знаю как в компьютерном классе отобразится):
Может проще мониторить(циклом секунд в 10-15) все открытые окна ? И при появлении нового окна далее уже и действие произзводить. вообще 2 разные программы запускать для многопоточности-= ну а при обнаружении постороннего окна - посыл в другую(необушную)программу .
Добавлено (26 Июня 2017, 12:36) --------------------------------------------- -Ну а про RACAutoIt3x - любой плагин можно применять и как угодно извращаться лишь бы это привело к результату
Может проще мониторить(циклом секунд в 10-15) все открытые окна ?
Я так и делаю, только циклом через четверть секунды.
ЦитатаAS3856 ()
2 разные программы запускать для многопоточности
В данном случае это уже избыточно круто. И так работает.
В общем, я изменил логику работы приложения. Было: что не разрешено, то запрещено. А теперь наоборот: что не запрещено, то разрешено. Факт открытия других файлов Excel мониторю по заголовку окна, как показал постом выше, а другие окна отслеживаю просто используя черный список, в который внес все типичные названия окон (точнее элементы их названий), которыми может попытаться воспользоваться нечестный пользователь (включая Проводник, Меню Пуск, портабельные браузеры, офисные пакеты, просмотрщики файлов, программы умеющие убивать процессы и т.п.).
поиск окна по части заголовка. Команда в плагине Петра этого не умеет делать
Ты в этом уверен? Упомянутая может и не умеет, но ведь есть и другая....
ЦитатаВадим ()
Т.е. свою задачу я худо-бедно решил
Значит вопрос закрыт? Ну и ладушки.
ЦитатаВадим ()
студенту будет проще выучить, чем пытаться мухлевать)
И это говорит человек, который сам когда-то был студентом.
ЦитатаAS3856 ()
а про RACAutoIt3x - любой плагин можно применять и как угодно извращаться лишь бы это привело к результату
Я не про применение плагина, а про саму идею (и реализацию) его создания. Это то же самое как создать плагин для выполнения необушных скриптов, вместо того, чтобы вызывать их прямо из кода NB.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Добавлено (26 Июня 2017, 18:34) ---------------------------------------------
ЦитатаPeter ()
Это то же самое как создать плагин для выполнения необушных скриптов, вместо того, чтобы вызывать их прямо из кода NB.
Есть такой плагин для создания подобных плагинов. Кстати не плохая идея но так смотрю никто не пользуется этим плагином.
Создавать плагины с необушным скриптом даже замечательная идея. Можно делать что то типа библиотек dll, только внутри скрипт необук. Те же самые функции, только в виде библиотеки с зщищенным от изменений скриптом.
Добавлено (26 Июня 2017, 18:40) ---------------------------------------------
ЦитатаPeter ()
И это говорит человек, который сам когда-то был студентом.
Сейчас все поставлено на денежном эквиваленте. Не выучил, пара сотен баксов в зачетку - сдал. Я б тоже о студентах постоянно заботу проявлял бы. И чем больше заботы, тем больше бумажек в зачетку нужно класть.
Да вроде что-то было... припоминаю... И вроде даже у HPW....
Цитатаmishem ()
Создавать плагины с необушным скриптом даже замечательная идея.
Гм...
Цитатаmishem ()
Те же самые функции
Вот именно! И НАХРЕНА ТУТ ПЛАГИН?!!!
Цитатаmishem ()
с зщищенным от изменений скриптом.
От кого защищенным? И для чего?
Клепать бесполезные и глючные плагины лишь бы гордо преодолеть планку в 1000 формальных команд... В добавок и приличных денег запросить за, фактически, чужую бесплатную работу (это в стиле а-оя эспиральта).
У эсперальты сейчас каждый плагин по 40 евро!!!! Когда я увидел, так, честное слово, глазам своим не поверил! А за всю свою халтуру (гуртом) он просит в четыре (если не в пять!!) раза больше, чем стоит сама NB! И это с учетом "скидки"!!!
Здравый смысл давно уже не в почете.
Кстати, я как-то посмотрел некоторые его плагины... Количество команд можно смело сократить, минимум, в два раза (а местами и в три), если хоть чуток задуматься и грамотно их организовать. Прекрасный пример того как НЕ НАДО делать плагины.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Этих достаточно, там свежая версия Excel и файл будет извлечен из проги во время её загрузки, так что расширение мне известно заранее.
ЦитатаPeter ()
И это говорит человек, который сам когда-то был студентом.
Когда я был студентом были бумажные библиотеки, а сейчас интернет... Не хочу профанировать образование, это раз. Не хочу быть цербером и унижаться слежкой - кто открыл браузер и полез искать готовый ответ, это два. Достаточно двух причин, чтобы найти технологичное решение.
Вадим, я это сказал к тому, что все-равно они найдут лазейку.
ЦитатаВадим ()
Вопрос как раз открыт
Ясно, что всем и всегда хочется иметь не костыли, а "универсальное" и надежное решение. При оказии постараюсь не забыть, но... Сегодня у кого-то одна идея, завтра - другая, послезавтра - третья.... Увы, возможности NB сильно ограничены, и это, хоть и печальный, но - факт. И все то же самое со ВСЕМИ (без исключений) скриптовыми языками. Разница лишь в том, что для какого-то скриптового языка много "примочек", а для какого-то - мало. В сравнение с другими языками для NB их очень и очень мало. А все эти HTML-, JS-, VBS- и проч. "примочки" на чем написаны?...
Вот именно!
И это... Универсальное (на ВСЕ случаи жизни) решение есть - Delphi (С++), но... длинный и непростой путь.. За все приходится платить! Такова "селяви".
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Сегодня у кого-то одна идея, завтра - другая, послезавтра - третья...
Это точно!
ЦитатаPeter ()
Разница лишь в том, что для какого-то скриптового языка много "примочек", а для какого-то - мало.
Как раз благодаря плагинам (и примочкам) для NeoBook я ещё ни разу не встретился с препятствием, которое оказалось бы фатальным для нужного мне проекта. Всегда находится выход! И это потрясающе! Я очень благодарен за это тебе лично и всем плагинотворцам, чей труд мне пригодился и ещё много раз, я уверен, поможет мне в будущем! Все-таки взрослые языки программирования - это целая отдельная профессия, на освоение которой у меня просто нет ресурсов. NeoBook - это чудо!!!
По сути это не ппагин, а только обертка плагина. Повторяю, делать что то подобие библиотек dll, чисто для себя. Можно и для других. По сути та же функция только в блокноте не почитаешь и не изменишь.
Создаешь такие библиотеки, плагины, как хошь назови. Кидаешь в папку с программой и пользуешься. Суть заключается в том, что в одном плагине(библиотеке) можно создать несколько разных функций. Создать несколько библиотек разной тематики. Можно взять к примеру какую то консольную программу и к ней накидать список команд обернув в такой плагин. и т.д.
ЦитатаPeter ()
Клепать бесполезные и глючные плагины лишь бы гордо преодолеть планку в 1000 формальных команд... В добавок и приличных денег запросить за, фактически, чужую бесплатную работу (это в стиле а-оя эспиральта).
Об этом вообще разговор не идет. Это не те плагины которые нужно делать на продажу.