TDosCommand - wstrzymanie wykonywania

0

Witam.

Jak wszystkim wiadomo (lub nie), aby wstrzymać działanie aplikacji konsolowej, należy wcisnąć klawisz
"Pause / Break", a następnie dowolnym klawiszem wznowić działanie.

W swojej aplikacji korzystam, z zewnętrznej aplikacji konsolowej i używam do tego TDosCommand.
W tym przypadku nie pokazuje się okno konsoli, tylko wszystkie dane są wyświetlane w Memo.

Teraz pytanko, w jaki sposób dobrać się do tego, aby używając TDosCommand, można było wstrzymać wykonywanie
zewnętrznego programu konsolowego, a następnie go wznowić.

Wiem, że można rozwiązać to, normalnie uruchamiając aplikację zewnętrzną przez ShellExecute, a następnie pobrać uchwyt okna i wysłać komunikat. Ale chodzi o to aby okienko konsolowe w ogóle się nie pokazywało, co w przypadku TDosCommand sprawdza się super :)

0

http://www.freeml.com/ap-ext/5 moze sie przyda

0
Młody napisał(a):

Wiem, że można rozwiązać to, normalnie uruchamiając aplikację zewnętrzną przez ShellExecute, a następnie pobrać uchwyt okna i wysłać komunikat. Ale chodzi o to aby okienko konsolowe w ogóle się nie pokazywało, co w przypadku TDosCommand sprawdza się super :)

Okno konsoli nie musi być widoczne, żeby można było do niego wysłać Ctrl-C.

0

Nie wiem jak tam w Delphi ale w FPC jest to: http://www.freepascal.org/docs-html/fcl/process/tprocess.html
Pozwala na ukrycie konsolki, input/output wspiera. Wspiera też suspend i resume...

0
-123oho napisał(a):

Nie wiem jak tam w Delphi ale w FPC jest to: http://www.freepascal.org/docs-html/fcl/process/tprocess.html
Pozwala na ukrycie konsolki, input/output wspiera. Wspiera też suspend i resume...

Niestety w Delphi nie ma :(

marogo napisał(a):

Okno konsoli nie musi być widoczne, żeby można było do niego wysłać Ctrl-C.

@marogo : A mógłbym prosić o jakąś podpowiedź ? :)

0

A więc tak:
Jeśli okno konsoli jest widoczne, to procedura:

  uchwyt := FindWindow('ConsoleWindowClass', nil);
  if uchwyt > 0 then
  begin
    PostMessage(uchwyt, WM_KEYDOWN, vk_pause, 0);
    PostMessage(uchwyt, WM_KEYUP, vk_pause,  0);
  end;

znajduje okno i wysyła komunikat, jest ok, ale jeśli okno konsoli jest ukryte,
to procedura znajduje uchwyt, ale komunikat nie dociera :(

Pewnie jest, jeszcze coś, czego nie wiem, proszę o wszelkie wskazówki.

0
Młody napisał(a):
-123oho napisał(a):

Nie wiem jak tam w Delphi ale w FPC jest to: http://www.freepascal.org/docs-html/fcl/process/tprocess.html
Pozwala na ukrycie konsolki, input/output wspiera. Wspiera też suspend i resume...

Niestety w Delphi nie ma :(

Taa...na bank sprawdzałeś.

Młody napisał(a):
marogo napisał(a):

Okno konsoli nie musi być widoczne, żeby można było do niego wysłać Ctrl-C.

@marogo : A mógłbym prosić o jakąś podpowiedź ? :)

Ad. widoczności:
CreateProcess -> lpStartupInfo.wShowWindow:=SW_HIDE,

Ad. Suspend/Resume:
CreateProcess -> dwCreationFlags:=(..) or CREATE_SUSPENDED;

0
Młody napisał(a):

A więc tak:
Jeśli okno konsoli jest widoczne, to procedura:

  uchwyt := FindWindow('ConsoleWindowClass', nil);
  if uchwyt > 0 then
  begin
    PostMessage(uchwyt, WM_KEYDOWN, vk_pause, 0);
    PostMessage(uchwyt, WM_KEYUP, vk_pause,  0);
  end;

znajduje okno i wysyła komunikat, jest ok, ale jeśli okno konsoli jest ukryte,
to procedura znajduje uchwyt, ale komunikat nie dociera :(

Pewnie jest, jeszcze coś, czego nie wiem, proszę o wszelkie wskazówki.

uchwyt:=FindWindow('ConsoleWindowClass', nil);
SetForegroundWindow(uchwyt); //tego zapewne zabrakło
//--------- wysłanie do okna konsoli klawiszy Ctrl-C ------------
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); //wciśnięcie klawisza Ctrl
keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), 0, 0); //wciśnięcie klawisza 'C'
keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), KEYEVENTF_KEYUP, 0); //puszczenie 'C'
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0); //puszczenie Ctrl
0
marogo napisał(a):
uchwyt:=FindWindow('ConsoleWindowClass', nil);
SetForegroundWindow(uchwyt); //tego zapewne zabrakło
//--------- wysłanie do okna konsoli klawiszy Ctrl-C ------------
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); //wciśnięcie klawisza Ctrl
keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), 0, 0); //wciśnięcie klawisza 'C'
keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), KEYEVENTF_KEYUP, 0); //puszczenie 'C'
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0); //puszczenie Ctrl

Tak, to wszystko pięknie działa w przypadku widocznego okna konsoli, ale jeśli jest ukryte, to niestety nie.
Jak już wpomniałem wcześniej używam TDosCommand, może ten komponent, cosik blokuje.

0

Może inaczej, jak prawidłowo wysłać komunikat do aplikacji non-windowed?

1 użytkowników online, w tym zalogowanych: 0, gości: 1