//-------unit code
unit vkey;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, ExtCtrls, StdCtrls;
type
TFrmsoftkey = class(TForm)
SBchar: TSpeedButton;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
SpeedButton6: TSpeedButton;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
SpeedButton9: TSpeedButton;
SpeedButton10: TSpeedButton;
SpeedButton11: TSpeedButton;
SpeedButton12: TSpeedButton;
SpeedButton13: TSpeedButton;
SpeedButton14: TSpeedButton;
SpeedButton15: TSpeedButton;
SpeedButton16: TSpeedButton;
SpeedButton17: TSpeedButton;
SpeedButton18: TSpeedButton;
SpeedButton19: TSpeedButton;
SpeedButton20: TSpeedButton;
SpeedButton21: TSpeedButton;
SpeedButton22: TSpeedButton;
SpeedButton23: TSpeedButton;
SpeedButton24: TSpeedButton;
SpeedButton25: TSpeedButton;
SpeedButton26: TSpeedButton;
SpeedButton27: TSpeedButton;
SpeedButton28: TSpeedButton;
SpeedButton29: TSpeedButton;
SpeedButton30: TSpeedButton;
SpeedButton31: TSpeedButton;
SpeedButton32: TSpeedButton;
SpeedButton33: TSpeedButton;
SpeedButton34: TSpeedButton;
SpeedButton35: TSpeedButton;
SpeedButton36: TSpeedButton;
SpeedButton37: TSpeedButton;
SpeedButton38: TSpeedButton;
SpeedButton39: TSpeedButton;
SpeedButton40: TSpeedButton;
SpeedButton41: TSpeedButton;
SpeedButton42: TSpeedButton;
SpeedButton43: TSpeedButton;
SpeedButton44: TSpeedButton;
SpeedButton45: TSpeedButton;
SpeedButton46: TSpeedButton;
SpeedButton47: TSpeedButton;
SpeedButton48: TSpeedButton;
SpeedButton60: TSpeedButton;
SpeedButton65: TSpeedButton;
SBMin: TSpeedButton;
Lblcaps: TLabel;
Lbldot: TLabel;
Bevel1: TBevel;
procedure WMActivate(var Message: TMessage); message WM_ACTIVATE;
procedure SBMinClick(Sender: TObject);
procedure KeyMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SBcharClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure capsClick(Sender: TObject);
procedure sysClick(Sender: TObject);
private
procedure Sendkeys(Hz:Longint;state:Longint=0);
{ Private declarations }
public
{ Public declarations }
HActWin,Hself:Longint;
end;
var
Frmsoftkey: TFrmsoftkey;
implementation
{$R *.DFM}
procedure TFrmsoftkey.WMActivate(var Message: TMessage);
begin
if Message.wParam = WA_CLICKACTIVE then //wParamLo
begin
//SetActiveWindow(message.lParam);
if (HActWin<>message.lParam) and (message.lParam<>Hself) then
HActWin:=message.lParam;
end;
end;
procedure TFrmsoftkey.SBMinClick(Sender: TObject);
begin
close;
end;
procedure TFrmsoftkey.keyMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, $F012, 0);
end;
end;
procedure TFrmsoftkey.SBcharClick(Sender: TObject);
var
S:string;
begin
SetActiveWindow(HActWin);
s:= Tbutton(Sender).Caption;
SendKeys(ord(s[1]));
//SetActiveWindow(HActWin);
end;
procedure TFrmsoftkey.Sendkeys(Hz:Longint;state:longint=0);
var
focushld,windowhld:hwnd;
threadld:dword;
begin
windowhld:=GetForegroundWindow;
threadld:=GetWindowThreadProcessId(Windowhld,nil); //Windowhld
AttachThreadInput(GetCurrentThreadId,threadld,true);
Focushld:=getfocus;
AttachThreadInput(GetCurrentThreadId,threadld,false);
if focushld = 0 then Exit;
postMessage(focushld, WM_IME_CHAR, Hz,state);
end;
procedure TFrmsoftkey.FormCreate(Sender: TObject);
begin
Hself:=Handle ;
end;
procedure TFrmsoftkey.capsClick(Sender: TObject);
var
i,t,c:Integer;
const
uplist:string='~!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?';
dolist:string='`1234567890-=/qwertyuiop[]asdfghjkl;''zxcvbnm,./';
begin
c:=ComponentCount -1;
for i :=0 to c do
begin
if (Components is TSpeedButton) and (Length(TSpeedButton(Components).Caption)=1) then
if Tag=0 then
begin
t:=pos(TSpeedButton(Components).Caption,dolist);
if t<>0 then
if copy(uplist,t,1)='&' then
TSpeedButton(Components).Caption:='&&'
else
TSpeedButton(Components).Caption:=copy(uplist,t,1);
end
else
begin
t:=pos(TSpeedButton(Components).Caption,uplist);
if t<>0 then
TSpeedButton(Components).Caption:=copy(dolist,t,1);
end;
end;
//要加入用SetKeyboardState设置键盘Caps状态
if tag= 1 then
begin
SpeedButton7.Caption:='7';
lbldot.Font.Color:=clBlack;
end
else
lbldot.Font.Color:=clYellow;
Tag:=(Tag+1) mod 2;
end;
procedure TFrmsoftkey.sysClick(Sender: TObject);
var
key:longint;
begin
if Tbutton(Sender).Caption='←' then
key:=$8;
if Tbutton(Sender).Caption='Tab' then
key:=$9;
SetActiveWindow(HActWin);
SendKeys(key);
end;
end.