Что нового

Диалоговое окно для CMD

Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
madmasles Вы не могли подсказать, по вашему мнению где именно находится этот баг?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
lorents,
ИМХО, при одинаковых заголовках, вспомогательный скрипт не дожидается появления "своего" окна, а перехватывает уже существующее (в функции _ExecuteScript()).

Попробуйте этот вариант.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
madmasles Супер!!! :laugh:
СПАСИБО! :IL_AutoIt_1:
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Добрый день!
Недавно нашел два бага в новой версии.
1. не работает блокировка окна cmd и появляется значок в панели задач, если проект запускать через Far Manager
2. если в скрипте bat использовать выражение

Код:
for /f "tokens=* delims=" %%a in ('dlgmsgbox "Folder3" "Image Catalyst" "Выберите каталог для выходных файлов:"') do set "outdir=%%~a"

то проект не блокирует окно cmd и появляется значок в панели задач.

С прошлой версии таких багов не было. Могу предположить это из-за идентификации окна

madmasles, предлагаю вернуться к старой версии, и передавать значение Pid в проект

Код:
@echo off
set "rnd=%random%"
set "name=Image Catalyst"
title %rnd%
for /f "tokens=1,2" %%a in ('tasklist /v /fi "imagename eq cmd.exe" ^| findstr /c:"%rnd%" 2^>nul') do set "pid=%%b"
echo.%pid%
title %name%
pause

правда есть одна проблема, tasklist не у всех версий винды есть, т.е. выходит проект ищет по заголовку окна, и если есть возможность то и по pid.


Добавлено:
Сообщение автоматически объединено:

madmasles, Вы не могли бы выдать мне код предыдущей версии проекта?
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
добрый день!
Подскажите, как сделать, чтобы функция Folder поддерживала многострочный текст?
Сейчас эту функцию поддерживает только функция Msg
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
lorents
Если ты под диалоговым окном понимаешь
Код:
FileOpenDialog или FileSaveDialog или FileSelectFolder или MsgBox
то у каждой их этих функций есть последний параметр hwnd, который определяет хэндл родительского окна. Если его указывать - то все диалоги будут поверх окна с этим хэндлом.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
inververs
Тут одна проблема, cmd не может определить hwnd, он может определить PID используя tasklist (он не на всех версиях винды есть, например на windows XP home его нету).
Могу предложить внедрить в скрипт функцию поиска hwnd по PID.
или пусть сам скрипт определяет hwnd окна и передает в bat, а он в свою очередь пусть передает hwnd когда надо обратно в скрипт.
Я перелагаю сделать так, что в самом начале при запуске bat, он носит рандомный заголов, это дает возможность точно определить PID и hwnd, скрипт для bat предоставлял выше.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
В скрипт в таком случае можно ничего не передавать. Скрипт может сам найти PID родительского процесса, найти его окно, найти hwnd и вызывать одно из диалоговых окон.
И твоя проблема с отсутствием tasklist этим решается.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Скрипт может сам найти PID родительского процесса, найти его окно, найти hwnd и вызывать одно из диалоговых окон.
я как раз это и предлагал его как второй вариант, т.е. проект находит hwnd по заголовку (заголовок будет индивидуальным), он передает в bat значение hwnd, а потом при запуске скрипта я передаю значение hwnd обратно.
Все дело в том, что проект не понимает вот такое выражение:

Код:
for /f "tokens=* delims=" %%a in ('dlgmsgbox "Folder3" "Image Catalyst" "Выберите каталог для выходных файлов:"') do set "outdir=%%~a"

Вот и приходится придумывать кастыли.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Не вижу проблем ...
bat файл честно запускает dlgmsgbox и передает ему все параметры.
Мой dlgmsgbox.exe внутри
Код:
MsgBox(0,@AutoItPID,$CmdLineRaw)
ConsoleWrite("some out string")

и outdir=some out string как и положено :blink:
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Что-то я вообще ничего не понимаю :stars:
Смотрите я не программирую на autoit, поэтому мне трудно понять, можешь подробнее написать.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
lorents [?]
Все дело в том, что проект не понимает вот такое выражение:
Я прокоментировал это :smile: Запустил твой код - он сработал как и должен был. Мне стало не понятно, почему твой проект не понимает это выражение.
А лучше дождаться ответа от человека, кто делал тебе этот проект - сам скрипт не очень простой, а разбираться в чужой работе - это :stars:
(Видимо требования отображать диалоговые окна по центру cmd, скрывание кнопки с панели - его так усложняют.. Если бы всего этого не требовалось, то все функции можно было бы написать тремя примитивными "exe-шниками")
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Запустил твой код - он сработал как и должен был. Мне стало не понятно, почему твой проект не понимает это выражение.
а при этом окно dlgmsgbox блокирует окно cmd? и значок dlgmsgbox отображается в панели задач?
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Вот в этом проблема, он должен блокировать и не отображать значок. Надеюсь madmasles решит эту проблему.


Добавлено:
Сообщение автоматически объединено:

По сути надо добавить в dlgmsgbox функцию, которая находит значение hwnd, по уникальному заголовку.
и сделать, так, чтобы проект искал окно cmd не по заголовку уже, а по hwnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
lorents,
Я не знаю, почему отображается иконка в трее и не блокируется окно CMD.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
madmasles
в случае for /f запускается еще один дочерний процесс cmd, в котором и отрабатывает команда. Вполне возможно, что у этого дочернего процесса нет своего окна, соответственно нечего и блокировать.
До этого таких проблем не было, т.к. он блокировал окно cmd по заголовку, а сейчас по PID или hwnd.
Это проблема, из-за особенностей cmd.
Честно я вижу только один выход, в самом начале батника задаем оригинальный заоловок, по нему определяем pid или hwnd. передаем в батник, изменяем заголовок батника на нормальный вид, и при запуске dlgmsgbox передаем значение pid или hwnd, т.е. мы вместо заголовка, как раньше, передаем значение pid или hwnd.

В dlgmsgbox надо сделать два изменения:
1. с помощью заголовка окна cmd определить pid или hwnd
2. в место заголовка передавать в dlgmsgbox передавать значения pid или hwnd
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Ни кто не знает, как сделать:
1. с помощью заголовка окна cmd определить pid или hwnd, т.е. я передаю значение заголовка окна cmd в dlgmsgbox, а он определяет pid или hwnd. При этом заголовок окна уникальный.
2. передавать в dlgmsgbox значения pid или hwnd, чтобы точно определить какое окно блокировать

Вот исходники:
http://dl.dropbox.com/u/26599219/DlgMsgBox.7z


Добавлено:
Сообщение автоматически объединено:

для меня сейчас главное, сделать, так чтобы я мог указать значение pid или hwnd и dlgmsgbox по этому значению находит указанное окно. Т.е. добавить парамерт командной строки, по которому или по заголовку окна или значениям pid или hwnd находит нужное окно.

Например.
dlgmsgbox "-name:Image Catalyst"
dlgmsgbox "-pid:1025" или hwnd


Добавлено:
Сообщение автоматически объединено:

Подскажите, пожалуйста, как это можно сделать?
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Добрый вечер!
есть скрипт для открытия диалоговых окон из окна cmd - DlgMsgBox. Автор скрипта - madmasles (скрипт был создан специально для меня, и за это благодарю madmasles). К сожалению, у madmasles нет времени поддерживать скрипт, и хотел, может ли кто-нибудь его изменить?

В текущей версии, скрипт сам определяет из какого окна cmd его запустили. Проблема в том, что из-за особенностей работы cmd, скрипт не определяет окно cmd.

Например:

Код:
for /f "tokens=* delims=" %%a in ('dlgmsgbox "Folder3" "Image Catalyst" "Выберите каталог для выходных файлов:"') do set "outdir=%%~a"

Хотел попросить подсказать мне, как сделать, чтобы:
1. скрипт сам не определял окна запуска cmd
2 добавить параметры командной строки, чтобы я мог сам указать или заголовок окна cmd, или его pid. Например:
dlgmsgbox "-name:Image Catalyst"
dlgmsgbox "-pid:1025"

Я хочу сделать так, чтобы сам batch передавал ему значения pid.

Код:
@echo off
set "name=Image Catalyst"
title %name%
for /f "tokens=1,2" %%a in ('tasklist /v ^| findstr /c:"%name%" 2^>nul') do set "pid=%%b"
echo.%pid%
pause

Подскажите, пожалуйста, как можно ускорить скорость запуска приложения?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Нет никакого диалогового окна у CMD. То что у вас есть - это написанный скрипт специально для вашего бантика. А сейчас вы хотите что бы кто то начал разбираться в чужой работе и доработал ее.
Будет проще написать все с нуля на autoit
 
Верх