Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.027 c
3-74003
SergeyNew
2003-09-30 16:08
2003.10.23
dbt файл


14-74448
луис альберто
2003-10-04 01:28
2003.10.23
тест


3-74007
Ahmad K
2003-10-05 16:04
2003.10.23
Самый ламерский вопрос!!!


14-74397
Lony
2003-10-06 11:55
2003.10.23
Пароль на вход в Windows2000


8-74334
Mihey
2003-06-21 00:50
2003.10.23
Эффект explode.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский