home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Softwarová Záchrana 3
/
Softwarova-zachrana-3.bin
/
ArsClip
/
source.zip
/
UnitFrmHotKey.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2002-10-18
|
6KB
|
250 lines
unit UnitFrmHotKey;
{
Purpose:
Dialog to enter a Hotkey.
The user sees his keystrokes as he types them.
Notes:
If the keystroke is already taken, the user won't
be able to use it (since the system intercepts it
before sending to this dialog).
}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFrmHotkey = class(TForm)
bSet: TButton;
bCancel: TButton;
txtHotkey: TEdit;
Label1: TLabel;
procedure txtHotkeyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure txtHotkeyKeyPress(Sender: TObject; var Key: Char);
procedure bSetClick(Sender: TObject);
procedure bCancelClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
Hotkey_Ctrl : boolean;
Hotkey_Alt : boolean;
Hotkey_Winkey : boolean;
Hotkey_Shift : boolean;
Hotkey_Key : word;
SetPressed : boolean;
public
{ Public declarations }
function GetHotkey(var kAlt, kShift, kCtrl, kWinkey : boolean;
var VKCode : word;
var ReadableName : string) : boolean;
function GetHumanReadable( kAlt, kShift, kCtrl, kWinkey : boolean;
VKCode : word; var Valid : boolean) : string;
end;
var
FrmHotkey: TFrmHotkey;
implementation
const INVALID_KEYS : string = 'INVALID';
{$R *.dfm}
//
// Returns: MOD+KEYNAME when valid
// Returns: "INVALID" on illegal combination
//
function TFrmHotkey.GetHumanReadable( kAlt, kShift, kCtrl, kWinkey : boolean;
VKCode : word; var Valid : boolean) : string;
var s : string;
HasMod, HasKey : boolean;
const punc1 : string = ';=,-./`';
const punc2 : string = '[\]''';
begin
HasMod := false;
if kWinkey = true then begin
s := s + 'WINKEY+';
HasMod := true;
end;
if kCtrl = true then begin
s := s + 'CTRL+';
HasMod := true;
end;
if kShift = true then begin
s := s + 'SHIFT+';
HasMod := true;
end;
if kAlt = true then begin
s := s + 'ALT+';
HasMod := true;
end;
//
// Determine the non-modifier key pressed
//
HasKey := true;
case VKCode of
VK_BACK: begin s := s + 'BACKSPACE'; end;
VK_ESCAPE: begin s := s + 'ESCAPE'; end;
VK_TAB: begin s := s + 'TAB'; end;
VK_RETURN: begin s := s + 'ENTER'; end;
VK_PRINT: begin s := s + 'PRINT'; end;
VK_PAUSE: begin s := s + 'PAUSE'; end;
VK_SPACE: begin s := s + 'SPACE'; end;
VK_HOME: begin s := s + 'HOME'; end;
VK_END: begin s := s + 'END'; end;
VK_DECIMAL: begin s := s + 'DECIMAL'; end;
VK_INSERT: begin s := s + 'INSERT'; end;
VK_DELETE: begin s := s + 'DELETE'; end;
VK_PRIOR: begin s := s + 'PAGEUP'; end;
VK_NEXT: begin s := s + 'PAGEDOWN'; end;
VK_DOWN: begin s := s + 'DOWN'; end;
VK_UP: begin s := s + 'UP'; end;
VK_LEFT: begin s := s + 'LEFT'; end;
VK_RIGHT: begin s := s + 'RIGHT'; end;
VK_SUBTRACT:begin s := s + 'SUBTRACT'; end;
VK_ADD: begin s := s + 'ADD'; end;
VK_MULTIPLY:begin s := s + 'MULTIPLY'; end;
VK_DIVIDE: begin s := s + 'DIVIDE'; end;
VK_NUMLOCK: begin s := s + 'NUMLOCK'; end;
// 0 .. 9
48..57: begin s := s + chr(VKCode);
end;
// A .. Z
65..90: begin s := s + chr(VKCode);
end;
// numpad #
96..105: begin s := s + 'NUMPAD ' + IntToStr(VKCode - 95);
end;
// F1 .. F12
112..123: begin s := s + 'F' + IntToStr(VKCode-111);
end;
// punctuation VKCodes
186..192: begin
s := s + punc1[VKCode-185];
end;
// []\` VKCodes
219..222: begin
s := s + punc2[VKCode-218];
end;
else
HasKey := false;
end;
result := s;
valid := (HasMod and HasKey);
end;
//
// Return true if new hotkey was selected
//
function TFrmHotkey.GetHotkey(var kAlt, kShift, kCtrl, kWinkey : boolean;
var VKCode : word;
var ReadableName : string) : boolean;
var b : boolean;
begin
SetPressed := false;
self.ShowModal;
if SetPressed then begin
kAlt := Hotkey_Alt;
kShift := Hotkey_Shift;
kCtrl := Hotkey_Ctrl;
kWinkey := Hotkey_Winkey;
VKCode := Hotkey_key;
ReadableName := self.GetHumanReadable(kAlt, kShift, kCtrl, kWinkey, VKCode, b);
end;
result := SetPressed;
end;
procedure TFrmHotkey.txtHotkeyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var State : TKeyboardState;
s : string;
valid : boolean;
begin
bSet.Enabled := false;
Hotkey_alt := false;
Hotkey_Ctrl := false;
Hotkey_Shift := false;
Hotkey_Winkey := false;
//
// check modifier keys
//
Windows.GetKeyboardState(State);
if ((State[vk_rwin] and 128) <> 0) or ((State[vk_lwin] and 128) <> 0)then begin
Hotkey_Winkey := true;
s := s + 'WINKEY+';
end;
if ((State[vk_control] and 128) <> 0) then begin
Hotkey_Ctrl := true;
s := s + 'CTRL+';
end;
if ((State[vk_shift] and 128) <> 0) then begin
Hotkey_Shift := true;
s := s + 'SHIFT+';
end;
if ((State[vk_menu] and 128) <> 0) then begin
Hotkey_Alt := true;
s := s + 'ALT+';
end;
s := Self.GetHumanReadable(hotkey_alt, hotkey_shift, hotkey_ctrl, hotkey_winkey, key, valid);
//
// Final results
// Only allow button to be pressed when we have a modifier and
// a key selected
//
txtHotkey.text := s;
bSet.Enabled := Valid;
Hotkey_Key := key;
key := 0;
end;
procedure TFrmHotkey.txtHotkeyKeyPress(Sender: TObject; var Key: Char);
begin
key := #0;
end;
procedure TFrmHotkey.bSetClick(Sender: TObject);
begin
SetPressed := true;
self.Close;
end;
procedure TFrmHotkey.bCancelClick(Sender: TObject);
begin
self.Close;
end;
procedure TFrmHotkey.FormActivate(Sender: TObject);
begin
self.ActiveControl := txtHotkey;
end;
end.