Форум: "Основная";
Текущий архив: 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.51 MB
Время: 0.012 c