Интерфейс DOS-Windows
Moderator: Shaos
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Интерфейс DOS-Windows
Вот такая у меня проблема возникла: если приложние MS-DOS работает под Windows в полноэкранном
режиме, можно ли из него послать какое-либо сообщение самой Windows?
То есть, мне надо, чтобы при рабое в полноэкранном режиме по клику мыши (или по двойному клику) это
приложение MS-DOS свернулось.
Как будто в нём нажали [Alt]+[Enter].
режиме, можно ли из него послать какое-либо сообщение самой Windows?
То есть, мне надо, чтобы при рабое в полноэкранном режиме по клику мыши (или по двойному клику) это
приложение MS-DOS свернулось.
Как будто в нём нажали [Alt]+[Enter].
iLavr
-
- Maniac
- Posts: 287
- Joined: 05 Nov 2008 19:47
- Location: 81.28.208.238
Re: Windows 98/Me
Читал давным давно такую книгу
"Руководство программиста по Microsoft Windows 95"
Там было что-то про сервисы Windows для DOS
"Руководство программиста по Microsoft Windows 95"
Там было что-то про сервисы Windows для DOS
-
- Devil
- Posts: 907
- Joined: 26 May 2003 06:57
Re: Windows 98/Me
Многое можно сделать через int 2Fh.
Last edited by b2m on 30 Dec 2019 04:54, edited 4 times in total.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
http://bashkiria-2m.narod.ru/
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Я даже делал "что-то" через сервисы Windows для DOS - я написал резидентный драйвер мыши,aav8 wrote:...было что-то про сервисы Windows для DOS
которая в текстовом режиме изображала "графическую стрелку". Но в окне Windows эта стрелка
выглядела как 4 уродских псевдосимвола (это так и есть по сути

расширенный сервис INT 4FH, чтобы драйвер мог узнать у Windows - в оконном режиме приложение
DOS, или в полноэкранном.
В данный момент пытаюсь подумать в направлении INT 2FH, кажется. Приложение DOS может, как мне
кажется, послать что-то Windows через Clipboard или спулер печати.
Была у меня еще одна хитрая мысль: из приложения Windows в цикле "слушал" GetAsyncKeyState(VK_RBUTTON).
Под Windows работает четко - в любом приложении правую кнопку мыши "слышит", но полноэкранный
режим приложения DOS клики мыши в Windows не пропускает...

iLavr
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Пока удачно работает только вот такой трюк:
Приложение Windows запускает приложение DOS в полноэкранном режиме через:
ShellExecute(...)
Приложение Windows ждёт примерно 300...500 mS, чтобы приложение DOS запустилось.
Приложение Windows ищет "хэндлер" окна приложения DOS через имя окна и класс:
FindWindowA(...), класс окна DOS - "tty".
Если "хэндлер" найден, приложение Windows посылает окну приложения DOS:
SetActiveWindow("хэндлер" )
И далее приложение Windows посылает окну приложения DOS::
keybd_event(VK_MENU, 0) - нажали Alt;
keybd_event(VK_RETURN, 0) - нажали Enter;
Пауза 200 mS;
keybd_event(VK_RETURN, KEYEVENTF_KEYUP) - ОТжали Enter;
keybd_event(VK_MENU, KEYEVENTF_KEYUP) - ОТжали Alt;
И приложение DOS великолепно вернулось в оконный режим!
Работает также такой вариант - по нажатию кнопки в приложении Windows,
приложение Windows посылает окну приложения DOS:
keybd_event(VK_MENU, 0) - нажали Alt;
keybd_event(VK_RETURN, 0) - нажали Enter;
Пауза 200 mS;
keybd_event(VK_RETURN, KEYEVENTF_KEYUP) - ОТжали Enter;
keybd_event(VK_MENU, KEYEVENTF_KEYUP) - ОТжали Alt;
Пауза 5 секунд!;
keybd_event(VK_MENU, 0) - нажали Alt;
keybd_event(VK_RETURN, 0) - нажали Enter;
Пауза 200 mS;
keybd_event(VK_RETURN, KEYEVENTF_KEYUP) - ОТжали Enter;
keybd_event(VK_MENU, KEYEVENTF_KEYUP) - ОТжали Alt;
И приложение DOS великолепно разворачивается в полноэкранный режим и через 5 секунд
возвращается в оконный режим!
Осталось немного: как-то научиться "просигналить" приложению Windows из полноэкранного режима
приложения DOS...
Приложение Windows запускает приложение DOS в полноэкранном режиме через:
ShellExecute(...)
Приложение Windows ждёт примерно 300...500 mS, чтобы приложение DOS запустилось.
Приложение Windows ищет "хэндлер" окна приложения DOS через имя окна и класс:
FindWindowA(...), класс окна DOS - "tty".
Если "хэндлер" найден, приложение Windows посылает окну приложения DOS:
SetActiveWindow("хэндлер" )
И далее приложение Windows посылает окну приложения DOS::
keybd_event(VK_MENU, 0) - нажали Alt;
keybd_event(VK_RETURN, 0) - нажали Enter;
Пауза 200 mS;
keybd_event(VK_RETURN, KEYEVENTF_KEYUP) - ОТжали Enter;
keybd_event(VK_MENU, KEYEVENTF_KEYUP) - ОТжали Alt;
И приложение DOS великолепно вернулось в оконный режим!

Работает также такой вариант - по нажатию кнопки в приложении Windows,
приложение Windows посылает окну приложения DOS:
keybd_event(VK_MENU, 0) - нажали Alt;
keybd_event(VK_RETURN, 0) - нажали Enter;
Пауза 200 mS;
keybd_event(VK_RETURN, KEYEVENTF_KEYUP) - ОТжали Enter;
keybd_event(VK_MENU, KEYEVENTF_KEYUP) - ОТжали Alt;
Пауза 5 секунд!;

keybd_event(VK_MENU, 0) - нажали Alt;
keybd_event(VK_RETURN, 0) - нажали Enter;
Пауза 200 mS;
keybd_event(VK_RETURN, KEYEVENTF_KEYUP) - ОТжали Enter;
keybd_event(VK_MENU, KEYEVENTF_KEYUP) - ОТжали Alt;
И приложение DOS великолепно разворачивается в полноэкранный режим и через 5 секунд
возвращается в оконный режим!

Осталось немного: как-то научиться "просигналить" приложению Windows из полноэкранного режима
приложения DOS...

iLavr
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Вот еще мысль: если в приложении DOS программно "нажать" PrintScreen - оно должно обратиться
к Windows Clipboard или нет?
к Windows Clipboard или нет?

iLavr
-
- Devil
- Posts: 907
- Joined: 26 May 2003 06:57
Re: Windows 98/Me
Послать сообщение WM_USER+100h можно опять-таки через int 2Fh, но если хочется своих костыльных решений, то можно просто создавать/удалять файл в определённом каталоге 

Last edited by b2m on 30 Dec 2019 04:55, edited 1 time in total.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
http://bashkiria-2m.narod.ru/
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Проверил, из полноэкранного режима приложения DOS [PrintScreen] и [Alt]+[PrintScreen] при нажатии с клавиатуры работают.
Хотя пол-интернета слёзно пишут, что не работает, но спишем на Windows 98...
Попробую "нажать программно" [PrintScreen] или [Alt]+[PrintScreen] в приложении DOS.
Сообщение WM_USER+100h кому посылать? "Всем окнам"? Или эксплореру?
Хотя пол-интернета слёзно пишут, что не работает, но спишем на Windows 98...
Попробую "нажать программно" [PrintScreen] или [Alt]+[PrintScreen] в приложении DOS.
Сообщение WM_USER+100h кому посылать? "Всем окнам"? Или эксплореру?
iLavr
-
- Devil
- Posts: 907
- Joined: 26 May 2003 06:57
Re: Windows 98/Me
Тому, кого зарегистрируешь. Там как всегда (у мелких и мягких) не всё просто. Поэтому рекомендую всё-таки воспользоваться VSWITCHD.Lavr wrote:кому посылать?
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
http://bashkiria-2m.narod.ru/
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Можно небольшой пример "на пальцах"? Ну хотя бы, как я вот тут выше рассказал:b2m wrote: Поэтому рекомендую всё-таки воспользоваться VSWITCHD.
viewtopic.php?f=81&t=9497&start=105#p153084
iLavr
-
- Devil
- Posts: 907
- Joined: 26 May 2003 06:57
Re: Windows 98/Me
Ишь какой хитрый! 
Попробовал я, в Win2k нифига не работает. Собственно в инетах об этом тоже пишут.
Походу, чтобы это работало, нужно иметь соответствующий VxD, который и выполнит нужное действо. А где брать этот драйвер - нигде не сказано.
Механизм mov ax,1684h / mov bx,DeviceID / int 2Fh это собственно и есть документированный (легальный) способ связи между ДОС и виндой. DeviceID документируется мелкософтом, но можно, видимо, использовать нечто своё, типа 7FE0h, для своего драйвера, в надежде на то, что оно никогда не совпадёт с реальным.
Так что, как всегда, в инете пишут много, а реально работает из этого - шишь да маленько. Поиски продолжаются...

Попробовал я, в Win2k нифига не работает. Собственно в инетах об этом тоже пишут.
Походу, чтобы это работало, нужно иметь соответствующий VxD, который и выполнит нужное действо. А где брать этот драйвер - нигде не сказано.
Механизм mov ax,1684h / mov bx,DeviceID / int 2Fh это собственно и есть документированный (легальный) способ связи между ДОС и виндой. DeviceID документируется мелкософтом, но можно, видимо, использовать нечто своё, типа 7FE0h, для своего драйвера, в надежде на то, что оно никогда не совпадёт с реальным.
Так что, как всегда, в инете пишут много, а реально работает из этого - шишь да маленько. Поиски продолжаются...
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
http://bashkiria-2m.narod.ru/
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Нет, я просто умный...b2m wrote:Ишь какой хитрый!

А я вот про это знал, почему и попросил пример "на пальцах" - интересно было, что посоветует Г.Остер?b2m wrote:Походу, чтобы это работало, нужно иметь соответствующий VxD, который и выполнит нужное действо. А где брать этот драйвер - нигде не сказано.

Чисто к сведению, по хорошему и реально это, в частности, работает вот так:
Тут мне, как обычно, хочется напомнить, что мешает плохим танцорам из страны Советов...b2m wrote:... как всегда, в инете пишут много, а реально работает из этого - шишь да маленько.

И порекомендовать читать не только много, но и вдумчиво. Тогда всё получится.

Но с VxD я второй раз упражняться не хочу, ибо долго это.
А в данный момент мне как раз необходимы простенькие костылики...
iLavr
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Ну в общем-то эта идея с простым костыликом в черновом варианте сработала... Приложение Windows запускает приложение DOS, как было описано выше.Lavr wrote:Приложение DOS может, как мне кажется, послать что-то Windows через Clipboard ...
После чего с интервалом в 1 сек. начинает проверять Clipboard.
Приложение DOS - графическое, по нажатию на [Stop] левой кнопкой или
правой кнопкой в любом месте экрана, открывает Clipboard, очищает его,
заносит в Clipboard текст "ABCD", и закрывает Clipboard.
По сообщениям на экране видно, что все функции сработали корректно.
Как корректно приложению DOS работать с Clipboard под Windows подробно
изложили "классики марксизма" - братья Фроловы:

http://www.frolov-lib.ru/books/bsp/v06/ch7_3.htm
Приложение Windows проверяет пуст ли Clipboard. Если он не пуст, проверяется
тип данных, и если данные текстовые, Clipboard считывается. И только если
считан текст "ABCD", приложение Windows очищает Clipboard и посылает окну
приложения DOS события нажатия и отпускания [Alt] и [Enter].
Далее Clipboard снова циклически тестируется с интервалом в 1 сек.
Под Windows с Clipboard работают через Win API опять же в полном согласии
с "классиками марксизма":

http://www.frolov-lib.ru/books/bsp/v17/ch2_1.htm
У них только нет, как быстро проверить пуст ли Clipboard, это лучше делать так:
Code: Select all
Declare Function CountClipboardFormats Lib "user32" () As Long
...
if CountClipboardFormats = 0 then MsgBox "Clipboard is empty !!!"
You do not have the required permissions to view the files attached to this post.
iLavr
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Сама идея оказалась очень правильная, только мне не понравился опрос по таймеру.Lavr wrote:Ну в общем-то эта идея с простым костыликом в черновом варианте сработала...Lavr wrote:Приложение DOS может, как мне кажется, послать что-то Windows через Clipboard ...
Приложение Windows запускает приложение DOS, как было описано выше.
После чего с интервалом в 1 сек. начинает проверять Clipboard....

Это, и правда, довольно неуклюжий костыль...

Поэтому я сначала подумал, а не поставить ли hook на события мыши и отлавливать нажатие
в окне, к примеру, правой кнопки?
Но это сработало лишь для режима "сеанс MS DOS" в режиме окна. В полноэкранном режиме
этот трюк не проходит. События мыши не проникают через полноэкранный режим...

Вобще полноэкранный режим MS DOS - это какая-то вещь в себе, нигде толком не пишут, что
там конкретно работает и как. Максимум - что это "режим, аналогичный реальной DOS, но
эмулируемый средствами Windows", причем настройку его определяет *.pif файл, вплоть до того,
что в каждом случае можно иметь собственный autoexec и config...
Если Windows чего-то не может сэмулировать, она предлагает выход в реальный DOS с
возвратом в неё. (Конечно, это всё справедливо для младших версий Windows, в старших -
ситуация еще сложнее... )
Ну и поскольку hook на события мыши не сработал, я подумал - а нельзя ли поставть
hook на события Clipboard?

Оказалось, что и никакой hook ставить не надо, механизм отслеживания Clipboard более
прост, хотя и мало известен: я лично - точно не знал...

Надо просто добавить свё окно к цепочке окон просмотра буфера обмена, и окна просмотра
буфера обмена получают сообщение WM_DRAWCLIPBOARD всякий раз, когда содержание
буфера изменяется. Этот механизм хорошо описан на русском по ссылкам:
http://vsokovikov.narod.ru/New_MSDN_API ... viewer.htm
http://vsokovikov.narod.ru/New_MSDN_API ... win_cb.htm
http://vsokovikov.narod.ru/New_MSDN_API ... bchain.htm
http://vsokovikov.narod.ru/New_MSDN_API ... win_cb.htm
http://vsokovikov.narod.ru/New_MSDN_API ... drawcb.htm
http://vsokovikov.narod.ru/New_MSDN_API ... viewer.htm
Попробую... жаль на hook событий мыши время зря потратил...

iLavr
-
- Supreme God
- Posts: 16682
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Windows 98/Me
Великолепно этот механизм работает!Lavr wrote:Надо просто добавить свё окно к цепочке окон просмотра буфера обмена, и окна просмотра
буфера обмена получают сообщение WM_DRAWCLIPBOARD всякий раз, когда содержание
буфера изменяется.

в Windows практически что угодно!

Лишь бы со стороны Windows был свой "слушатель" в цепочке окон просмотра буфера обмена...
А своего "слушателя" я посадил в трей, чтобы он не маячил окном на экране (иконка там с
красным шаром).
Ну и поскольку я весьма посредственный программист на С++, мне очень помогли вот эти статьи:
С++ - GetClipboardData(CF_TEXT) - Stack Overflow
Пример Окна просмотра буфера обмена
Ну и последний момент преодолеть осталось: дело в том, что программа, ради которой я стараюсь,
принципиально написана без поддержки мыши. Видимо, придется написать под неё маленький резидент,
который запустит обслуживание мыши.

You do not have the required permissions to view the files attached to this post.
iLavr