Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.23;
Скачать: CL | DM;

Вниз

как восстановить консольное окно на весь экран   Найти похожие ветки 

 
Serguar ©   (2003-10-08 09:10) [0]

Привет всем! У меня программа, которая посылает сообщение консольному приложению, что бы оно максимизировалось из taskbar"a. Все работает нормально, только консольное окно восстанавливается в оконном режиме. Как программно нажать Alt+Enter для консольного окна, что бы оно восстановилось на весь экран?.
Заранее благодарен.


 
Yanis ©   (2003-10-08 09:11) [1]

Alt+Enter poslat"


 
alena.svt   (2003-10-08 09:40) [2]

procedure MaximizeConsole;
begin
keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
keybd_event(VK_RETURN,MapVirtualKey(VK_RETURN,0), 0, 0);
keybd_event(VK_MENU,MapVirtualKey(VK_MENU, 0),KEYEVENTF_KEYUP, 0);
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), KEYEVENTF_KEYUP, 0);
end;

Только модуль Windows нужен


 
Serguar ©   (2003-10-08 10:33) [3]

Консольное окно не мое, исходников нет. Это программа на Fox"e которая запускается с параметрами через bat-файл на рабочем столе. Моя задача, если консольное проложение уже запущено, но минимизировано, не дать запустить второй ее экземпляр и восстановить на весь экран.


 
Serguar ©   (2003-10-08 11:13) [4]

> Yanis © (08.10.03 09:11) [1]
Alt+Enter poslat"

Каким образом? Если через SendMessage(), то какой код посылать?


 
alena.svt   (2003-10-09 12:30) [5]

Вчера парень вопрос задал вы все его видите выше
Сутки билась, но вот у Пачеко нашла
Переписала код , чтоб все на виду было.
Прошу помочь в вопросе.,ато голова лопнет хотя проблема и не моя.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Playing: Boolean;

const
MaxKeys = 24;
ControlKey = "^";
AltKey = "@";
ShiftKey = "~";
KeyGroupOpen = "{";
KeyGroupClose = "}";
type

TMessageList = class(TList)
public
destructor Destroy; override;
end;

type
TKeyString = String[7];

TKeyDef = record
Key: TKeyString;
vkCode: Byte;
end;
type
TSendKeyError = (sk_None, sk_FailSetHook, sk_InvalidToken,sk_UnknownError, sk_AlreadyPlaying);
TvkKeySet = set of vk_LButton..vk_Scroll;

ESendKeyError = class(Exception);
ESKSetHookError = class(ESendKeyError);
ESKInvalidToken = class(ESendKeyError);
ESKAlreadyPlaying = class(ESendKeyError);
const
vkKeySet: TvkKeySet = [Ord("A")..Ord("Z"), vk_Menu, vk_F1..vk_F12];

const
KeyDefArray : array[1..MaxKeys] of TKeyDef = (
(Key: "F1"; vkCode: VK_F1),
(Key: "F2"; vkCode: VK_F2),
(Key: "F3"; vkCode: VK_F3),
(Key: "F4"; vkCode: VK_F4),
(Key: "F5"; vkCode: VK_F5),
(Key: "F6"; vkCode: VK_F6),
(Key: "F7"; vkCode: VK_F7),
(Key: "F8"; vkCode: VK_F8),
(Key: "F9"; vkCode: VK_F9),
(Key: "F10"; vkCode: VK_F10),
(Key: "F11"; vkCode: VK_F11),
(Key: "F12"; vkCode: VK_F12),
(Key: "INSERT"; vkCode: VK_INSERT),
(Key: "DELETE"; vkCode: VK_DELETE),
(Key: "HOME"; vkCode: VK_HOME),
(Key: "END"; vkCode: VK_END),
(Key: "PGUP"; vkCode: VK_PRIOR),
(Key: "PGDN"; vkCode: VK_NEXT),
(Key: "TAB"; vkCode: VK_TAB),
(Key: "ENTER"; vkCode: VK_RETURN),
(Key: "BKSP"; vkCode: VK_BACK),
(Key: "PRTSC"; vkCode: VK_SNAPSHOT),
(Key: "SHIFT"; vkCode: VK_SHIFT),
(Key: "ESCAPE"; vkCode: VK_ESCAPE));

function FindKeyInArray(Key: TKeyString; var Code: Byte): Boolean;
function SendKeys(S: String): TSendKeyError;
procedure WaitForHook;
procedure StopPlayback;

var
MsgCount: word = 0;
MessageBuffer: TEventMsg;
HookHandle: hHook = 0;
MessageList: TMessageList = Nil;
AltPressed, ControlPressed, ShiftPressed: Boolean;
implementation

{$R *.DFM}

function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
case Code of
HC_SKIP:
begin

inc(MsgCount);

if MsgCount >= MessageList.Count then StopPlayback
else MessageBuffer := TEventMsg(MessageList.Items[MsgCount]^);
Result := 0;
end;
HC_GETNEXT:
begin
PEventMsg(lParam)^ := MessageBuffer;
Result := 0 { process immediately }
end
else
Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;
end;

procedure StartPlayback;

begin

MessageBuffer := TEventMsg(MessageList.Items[0]^);
MsgCount := 0;
AltPressed := False;
ControlPressed := False;
ShiftPressed := False;
HookHandle := SetWindowsHookEx(wh_JournalPlayback, Play, hInstance, 0);
if HookHandle = 0 then
raise ESKSetHookError.Create("Failed to set hook");
Playing := True;
end;



 
alena.svt   (2003-10-09 12:31) [6]


procedure MakeMessage(vKey: byte; M: Cardinal);
var
E: PEventMsg;
begin
New(E);
with E^ do
begin
message := M;
paramL := vKey;
paramH := MapVirtualKey(vKey, 0);
time := GetTickCount;
hwnd := 0;
end;
MessageList.Add(E);
end;

procedure KeyDown(vKey: byte);

begin
if AltPressed and (not ControlPressed) and (vKey in vkKeySet) then
MakeMessage(vKey, wm_SysKeyDown)
else
MakeMessage(vKey, wm_KeyDown);
end;

procedure KeyUp(vKey: byte);

begin
if AltPressed and (not ControlPressed) and (vKey in vkKeySet) then
MakeMessage(vKey, wm_SysKeyUp)
else
MakeMessage(vKey, wm_KeyUp);
end;

procedure SimKeyPresses(VKeyCode: Word);
begin

if AltPressed then
KeyDown(vk_Menu);

if ControlPressed then
KeyDown(vk_Control);

if (((Hi(VKeyCode) and 1) <> 0) and (not ControlPressed)) or
ShiftPressed then
KeyDown(vk_Shift);
KeyDown(Lo(VKeyCode));
KeyUp(Lo(VKeyCode));

if (((Hi(VKeyCode) and 1) <> 0) and (not ControlPressed)) or
ShiftPressed then
KeyUp(vk_Shift);

if ShiftPressed then begin
ShiftPressed := False;
end;

if ControlPressed then begin
KeyUp(vk_Control);
ControlPressed := False;
end;

if AltPressed then begin
KeyUp(vk_Menu);
AltPressed := False;
end;
end;

procedure ProcessKey(S: String);
var
KeyCode: word;
Key: byte;
index: integer;
Token: TKeyString;
begin
index := 1;
repeat
case S[index] of
KeyGroupOpen:
begin
Token := "";
inc(index);
while S[index] <> KeyGroupClose do begin
Token := Token + S[index];
inc(index);
if (Length(Token) = 7) and (S[index] <> KeyGroupClose) then
raise ESKInvalidToken.Create("No closing brace");
end;
if not FindKeyInArray(Token, Key) then
raise ESKInvalidToken.Create("Invalid token");
SimKeyPresses(MakeWord(Key, 0));
end;
AltKey: AltPressed := True;
ControlKey: ControlPressed := True;
ShiftKey: ShiftPressed := True;
else begin
KeyCode := vkKeyScan(S[index]);
SimKeyPresses(KeyCode);
end;
end;
Inc(index);
until index > Length(S);
end;

function FindKeyInArray(Key: TKeyString; var Code: Byte): Boolean;
var
i: word;
begin
Result := False;
for i := Low(KeyDefArray) to High(KeyDefArray) do
if UpperCase(Key) = KeyDefArray[i].Key then begin
Code := KeyDefArray[i].vkCode;
Result := True;
Break;
end;
end;

function SendKeys(S: String): TSendKeyError;
begin
Result := sk_None;
try
if Playing then raise ESKAlreadyPlaying.Create("");
MessageList := TMessageList.Create;
ProcessKey(S);
StartPlayback;
except
on E:ESendKeyError do
begin
MessageList.Free;
if E is ESKSetHookError then
Result := sk_FailSetHook
else if E is ESKInvalidToken then
Result := sk_InvalidToken
else if E is ESKAlreadyPlaying then
Result := sk_AlreadyPlaying;
end
else
Result := sk_UnknownError;
end;
end;

procedure StopPlayback;

begin
if Playing then
UnhookWindowsHookEx(HookHandle);
MessageList.Free;
Playing := False;
end;

procedure WaitForHook;
begin
repeat Application.ProcessMessages until not Playing;
end;
{ TMessageList }

destructor TMessageList.Destroy;
var
i: longint;
begin
for i := 0 to Count - 1 do
Dispose(PEventMsg(Items[i]));
inherited Destroy;
end;


Теперь самое интересное нахожу Блокнот посылаю ему "Привет мир!" и посылаю ему ALT + F4 все работает

procedure TForm1.Button1Click(Sender: TObject);
var
H: hWnd;
PI: TProcessInformation;
SI: TStartupInfo;
begin
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
if CreateProcess(nil, "Notepad", nil, nil, False, 0, nil, nil, SI,
PI) then
begin
WaitForInputIdle(PI.hProcess, INFINITE);
H := FindWindow("Notepad","Безымянный - Блокнот");
if SetForegroundWindow(H) then
SendKeys("Hello World!" + "@" + "{F4}");
end
else
MessageDlg(Format("Failed to invoke Notepad. Error code %d",
[GetLastError]), mtError, [mbOk], 0);
end;


Консольных приложений кроме TurboPascal"я у меня нет поэтому

H := FindWindow("ConsoleWindowClass","TPX.EXE");
SendKeys("@" + "{ENTER}");// Посылаю ALT + ENTER


НЕ РАБОТАЕТ ОБЪЯСНИТЕ ПЛИЗ ЕСЛИ КТО МЕНЯ ПОНЯЛ.

end.


 
MBo ©   (2003-10-09 13:50) [7]


{************************************************************
* Procedure PostKeyEx32
*
* Parameters:
* key : virtual keycode of the key to send. For printable
* keys this is simply the ANSI code (Ord(character)).
* shift : state of the modifier keys. This is a set, so you
* can set several of these keys (shift, control, alt,
* mouse buttons) in tandem. The TShiftState type is
* declared in the Classes Unit.
* specialkey: normally this should be False. Set it to True to
* specify a key on the numeric keypad, for example.
* Description:
* Uses keybd_event to manufacture a series of key events matching
* the passed parameters. The events go to the control with focus.
* Note that for characters key is always the upper-case version of
* the character. Sending without any modifier keys will result in
* a lower-case character, sending it with [ssShift] will result
* in an upper-case character!
*Created: 17.7.98 by P. Below
************************************************************}
Procedure PostKeyEx32( key: Word; Const shift: TShiftState;
specialkey: Boolean );
Type
TShiftKeyInfo = Record
shift: Byte;
vkey : Byte;
End;
byteset = Set of 0..7;
Const
shiftkeys: Array [1..3] of TShiftKeyInfo =
((shift: Ord(ssCtrl); vkey: VK_CONTROL ),
(shift: Ord(ssShift); vkey: VK_SHIFT ),
(shift: Ord(ssAlt); vkey: VK_MENU ));
Var
flag: DWORD;
bShift: ByteSet absolute shift;
i: Integer;
Begin
For i := 1 To 3 Do Begin
If shiftkeys[i].shift In bShift Then
keybd_event( shiftkeys[i].vkey,
MapVirtualKey(shiftkeys[i].vkey, 0),
0, 0);
End; { For }
If specialkey Then
flag := KEYEVENTF_EXTENDEDKEY
Else
flag := 0;

keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );
flag := flag or KEYEVENTF_KEYUP;
keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );

For i := 3 DownTo 1 Do Begin
If shiftkeys[i].shift In bShift Then
keybd_event( shiftkeys[i].vkey,
MapVirtualKey(shiftkeys[i].vkey, 0),
KEYEVENTF_KEYUP, 0);
End; { For }
End; { PostKeyEx32 }

procedure TForm1.Button1Click(Sender: TObject);
var h:thandle;
begin
H := FindWindow("ConsoleWindowClass",nil);
if H>0 then
if SetForegroundWindow(H) then
PostKeyEx32( VK_Return, [ssAlt], false );
end;



работает со всеми консольными приложениями, которые подвернулись.
А в твоем примере с окном TP нет SetForegroundWindow


 
Izyum ©   (2003-10-09 14:40) [8]

Искать инфу по SetWindowHookEx

P.S.: Не забыть опубликовать решение:-)


 
Serguar ©   (2003-10-09 14:46) [9]

Все работает !!! Огромное спасибо


 
Izyum ©   (2003-10-09 14:47) [10]

Не совсем внятно выразился, вернее совсем не внятно:)
Приведенный выше код умеет "нажимать" клавиши в чужих окнах. Это хорошо:) Но тут ИМХО нужен еще один hook - отлавливающий запуск твоего консольного приложения, проверяющий наличие уже запущенного экземляра и, если таковой нашелся, разворачивающего на весь экран (с использованием выше приведенного кода).


 
Anatoly Podgoretsky ©   (2003-10-09 14:52) [11]

TP не консольное приложение, а досовское.


 
alena.svt   (2003-10-09 14:53) [12]

Спасибо тебе MBo огромное,
Буду помнить всю жизнь, а то голова чуть не рванула.


 
Song ©   (2003-10-09 14:55) [13]

Алёна, сколько лет, сколько зим не появлялась ;)


 
Serguar ©   (2003-10-10 07:17) [14]

> Izyum © (09.10.03 14:47)
Все верно. И что думаешь по этому поводу?


 
Izyum ©   (2003-10-10 12:22) [15]


> Serguar © (10.10.03 07:17) [14]
> > Izyum © (09.10.03 14:47)
> Все верно. И что думаешь по этому поводу?

А чего тут думать?:) Нужно искать инфу, эксперементировать....и наслаждаться результатом.
Сам я этого не делал никогда, а копаться - просто времени нет.
Спроси у Мастеров, например у Anatoly Podgoretsky



Страницы: 1 вся ветка

Текущий архив: 2003.10.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.035 c
14-74453
Knight
2003-10-03 16:54
2003.10.23
Кто-нибудь один... не надо много


1-74284
romeo
2003-10-13 00:52
2003.10.23
Как запихать координаты точки в lParam для WM_LButtonDown?


7-74496
SniZ
2003-07-24 12:59
2003.10.23
Батарея


1-74269
Developerr
2003-10-11 12:58
2003.10.23
Как установить Tidestone Formula One 6 в Delphi.


9-73959
Vitas2
2003-04-18 17:30
2003.10.23
давайте что нибудь напишим все вместе