Potyanko takie same jak w temacie. Chodzi oto że jak mam nowy Form1 i ort! tworzę frame1 , to chcę zrobić tak że po wciśnięciu np. klawisza TAB pojawia się Frame a jak go zwolnię to frame znika. Coś podobnego jest w grze counter-strike z podglądem statów.Z góry dziękuję za pomoc:)
KeyPreview:= True (fromy) i przechwycić TAB, akcja na KeyDown i KeyUp
zbynio: jak masz pisać niesprawdzone bzdury to lepiej nic nie pisz. Do pytającego: z formatkami VCL i klawiszem TAB. jest tak że jeśli chcesz
go przechwycić musisz obslużyć komunikat CM_DIALOGKEY. Przykład kodu poniżej. Niestety nie wychwycisz wtedy, a przynajmniej ja nie wiem w
jaki sposób to zrobić, momentu wcisnięcia klawisza TAB oraz jego puszczenia. A do tego celu proponuje zastosować globalny hook na klawisze.
Poniżej masz też przykładowy kod. Sprawdzanie okna na pierwszym planie jest po to bo Hook działa w calym systemie dopóki go nie wyłaczysz.
Sposób z CM_DIALOGKEY (jeżeli chcesz przekierować obslugę klawisza dalej to użyj slowa kluczowego inherited):
//...
public
procedure CMDialogKey(var Msg : TWMKey); message CM_DIALOGKEY;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CMDialogKey(var Msg : TWMKEY);
begin
if (Msg.Charcode = VK_TAB) then
begin
// ...
end;
end;
Sposób z gloablnym hookiem na klawisze. Sprawdzilem dla zwykłego Penelu i działa, ale jak potrzebujesz to
możesz pokazywać inny komponent o ile ma on możliwość pokazania go i ukrycia na przykład przez Visible:
//...
const
WH_KEYBOARD_LL = $000D;
type
tagKBDLLHOOKSTRUCT = packed record
vkCode : DWord;
ScanCode : DWord;
Flags : DWord;
Time : DWord;
dwExtraInfo : integer;
end;
KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
var
Form1 : TForm1;
HKHook : HHook;
implementation
{$R *.dfm}
function LowLevelKeyboardProc(nCode : Integer; wParam : Integer; lParam : Integer) : Integer; stdcall; export;
var
Hook : PKBDLLHOOKSTRUCT;
begin
Hook := Pointer(lParam);
case nCode of
HC_ACTION :
begin
Form1.Panel1.Visible := (GetForeGroundWindow = Form1.Handle)
and (Hook.vkCode = VK_TAB) and (Hook.Flags = 0);
end;
end;
Result := CallNextHookEx(HKHook, nCode, wParam, lParam);
end;
procedure HookIt;
begin
HKHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, hInstance, 0);
end;
procedure UnHookIt;
begin
UnHookWindowsHookEx(HKHook);
end;
procedure TForm1.FormCreate(Sender : TObject);
begin
Hookit;
Panel1.Visible := False;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnHookit;
end;
Oj tam zaraz hooki na takie głupoty ;)
Proponuję coś takiego:
[***ciach***]
private
{ Private declarations }
procedure AppMessage(var Msg:TMsg;var Handled:Boolean);
[***ciach***]
implementation
{$R *.dfm}
procedure TForm1.AppMessage(var Msg:TMsg;var Handled:Boolean);
begin
if ((Msg.message = WM_KEYDOWN) and (Msg.wParam= VK_TAB)) then
begin
Memo1.Lines.Add('TAB DOWN');
//Handled:= True;
end
else if ((Msg.message = WM_KEYUP) and (Msg.wParam= VK_TAB)) then
begin
Memo1.Lines.Add('TAB UP');
//Handled:= True;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=AppMessage;
end;
[***ciach***]
Usuń komentarze przed Handled:= True jak chcesz się pozbyć domyślnego działania klawisza Tab czyli przechodzenia pomiędzy kontrolkami
EDIT// Oczywśicie to samo można uzyskać poprzez użycie ApplicationEvents
- co Ty kAzek, spać po nocach nie umiesz :P uprzedziłeś mnie bo chciałem zaproponować "coś w ten deseń" :P
- a czy nie prościej byłoby użyć innego klawisza ? Cuba napisał np. TAB
pozdro