![]() |
|
Masaüstü Uygulamalar İçin Özel Bir Klavye - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Açık Kaynak Kodlu Yazılım & Bileşen & Geliştirici Araçları (https://www.delphican.com/forumdisplay.php?fid=100) +--- Konu Başlığı: Masaüstü Uygulamalar İçin Özel Bir Klavye (/showthread.php?tid=3575) |
Masaüstü Uygulamalar İçin Özel Bir Klavye - narkotik - 20-04-2019 Merhaba, Masaüstü uygulamalar için zaman zaman sanal klavyeye ihtiyaç duyuyoruz. Windows'un kendi masaüstü klavyesi ise tam bir baş belası. Windows sürümünden sürümüne farklılıklar göstermekte. Delphi'nin kendi sanal klavyesi bulunmakta. Fakat açıkcası oda benim çok hoşuma gitmiyor.Tabi 3.parti bileşenlerde mevcut. Örnek TMS. Fakat benim TMS lisansım olmadığı için kendim yaptım. Bu konu altında kendi hazırladığım sanal klavyeyi paylaşacağım. Not: DevExpress bileşenleri kullanılmıştır. Lisansınız yoksa Delphinin kendi SpeedButtonlarını kullanabilirsiniz. Ben bir test sürecinden geçirdim. Eğer hata görürseniz bu konu altından bana iletirseniz bende sevinirim. ![]() Link : http://www.dosya.tc/server17/qcbzdo/TestKlavye.rar.html unit uKlavye;
{****************************
uKlavye.pas 2019
S.B.
*****************************}
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, cxGraphics, cxLookAndFeels, cxLookAndFeelPainters, Vcl.Menus, dxSkinsCore, dxSkinsDefaultPainters, cxButtons;
type
TFrmKlavye = class(TForm)
BtnHide: TcxButton;
Btn1: TcxButton;
Btn2: TcxButton;
Btn3: TcxButton;
Btn4: TcxButton;
Btn5: TcxButton;
Btn6: TcxButton;
Btn7: TcxButton;
Btn0: TcxButton;
Btn8: TcxButton;
Btn9: TcxButton;
BtnSlash: TcxButton;
BtnYildiz: TcxButton;
BtnBackSpace: TcxButton;
BtnTab: TcxButton;
BtnQ: TcxButton;
BtnU: TcxButton;
BtnY: TcxButton;
BtnP: TcxButton;
BtnO: TcxButton;
BtnE: TcxButton;
BtnI: TcxButton;
BtnR: TcxButton;
BtnW: TcxButton;
BtnT: TcxButton;
BtnG2: TcxButton;
BtnU2: TcxButton;
BtnCapsLock: TcxButton;
BtnA: TcxButton;
BtnJ: TcxButton;
BtnH: TcxButton;
BtnS2: TcxButton;
BtnL: TcxButton;
BtnD: TcxButton;
BtnK: TcxButton;
BtnF: TcxButton;
BtnS: TcxButton;
BtnG: TcxButton;
BtnI2: TcxButton;
BtnVirgul: TcxButton;
BtnShift: TcxButton;
BtnNoktaliVirgul: TcxButton;
BtnZ: TcxButton;
BtnM: TcxButton;
BtnN: TcxButton;
BtnC2: TcxButton;
BtnC: TcxButton;
BtnO2: TcxButton;
BtnV: TcxButton;
BtnX: TcxButton;
BtnB: TcxButton;
BtnNokta: TcxButton;
BtnShift2: TcxButton;
BtnEnter: TcxButton;
BtnEt: TcxButton;
BtnUnlem: TcxButton;
BtnSoruIsareti: TcxButton;
BtnYuzde: TcxButton;
BtnSpace: TcxButton;
BtnAltTre: TcxButton;
BtnTre: TcxButton;
BtnParantezKapat: TcxButton;
BtnParantezAc: TcxButton;
BtnTirnak: TcxButton;
procedure BtnHideClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure BtnCapsLockClick(Sender: TObject);
procedure BtnShiftClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormHide(Sender: TObject);
private
{ Private declarations }
public
xLeftShow,xTopShow : Integer;
xForm : TForm;
procedure CreateParams(var Params: TCreateParams); override;
procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
function CapsLockStatus:Boolean;
function ShiftStatus:Boolean;
procedure SetCapsLockStatus(const ACapsLock:Boolean);
procedure SetShiftStatus(const AShift:Boolean);
procedure CaptionUpperAndLower(const AUpper:Boolean);
function XEKadar(const AValue,APos:String):String;
function AfterX(const AValue,APos:String):String;
function StrUppercase(const AValue:String):String;
function StrLowercase(const AValue:String):String;
end;
var
FrmKlavye : TFrmKlavye;
implementation
{$R *.dfm}
{ TFrmKlavye }
function TFrmKlavye.StrUppercase(const AValue:String):String;
Var Ind : Integer;
begin
Result := '';
for Ind := 1 to Length(AValue) do
begin
if Ord(AValue[Ind]) = 305 then
Result := Result + 'I'
else if Ord(AValue[Ind]) = 105 then
Result := Result + 'İ'
else
Result := Result + AnsiUpperCase(AValue[Ind]);
end;
end;
function TFrmKlavye.StrLowercase(const AValue:String):String;
var Ind : Integer;
begin
Result := '';
for Ind := 1 to Length(AValue) do
begin
if Ord(AValue[Ind]) = 304 then
Result := Result + 'i'
else if AValue[Ind] = 'I' then
Result := Result + 'ı'
else
Result := Result + AnsiLowerCase(AValue[Ind]);
end;
end;
function TFrmKlavye.XEKadar(const AValue,APos:String):String;
Var xPos : Integer;
begin
xPos := AnsiPos(APos, AValue);
if xPos = 0 then
Result := AValue
else
Result := Copy(AValue,1,Pred(xPos))
end;
function TFrmKlavye.AfterX(const AValue,APos:String):String;
Var xPos : Integer;
begin
xPos := AnsiPos(APos, AValue);
if xPos = 0 then
Result := AValue
else
Result := Copy(AValue,Succ(xPos),MaxInt)
end;
function TFrmKlavye.CapsLockStatus: Boolean;
begin
Result := Odd(GetKeyState(VK_CAPITAL));
end;
procedure TFrmKlavye.CaptionUpperAndLower(const AUpper: Boolean);
Var Ind : Integer;
xBtn : TcxButton;
begin
for Ind := 0 to Pred(ComponentCount) do
begin
if Components[Ind] is TcxButton then
begin
xBtn := TcxButton(Components[Ind]);
if xBtn.Tag = 99 then //Harf
begin
if AUpper then
xBtn.Caption := StrUppercase(xBtn.Caption)
else
xBtn.Caption := StrLowercase(xBtn.Caption);
end
else if xBtn.Tag = 98 then
begin
if AUpper then
xBtn.Caption := AfterX(xBtn.HelpKeyword,'=')
else
xBtn.Caption := XEKadar(xBtn.HelpKeyword,'=');
end;
end;
end;
end;
procedure TFrmKlavye.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := WS_POPUP ;
end;
procedure TFrmKlavye.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
Action := caFree;
end;
procedure TFrmKlavye.FormHide(Sender: TObject);
begin
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end;
procedure TFrmKlavye.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_CAPITAL then
begin
if BtnCapsLock.SpeedButtonOptions.Down then
begin
BtnCapsLock.SpeedButtonOptions.GroupIndex := 0;
BtnCapsLock.SpeedButtonOptions.Down := False;
end
else
begin
BtnCapsLock.SpeedButtonOptions.GroupIndex := 1;
BtnCapsLock.SpeedButtonOptions.Down := True;
end;
CaptionUpperAndLower(BtnCapsLock.SpeedButtonOptions.Down);
Key := 0;
end
else if Key = VK_SHIFT then
begin
if BtnShift.SpeedButtonOptions.Down then
begin
BtnShift.SpeedButtonOptions.GroupIndex := 0;
BtnShift2.SpeedButtonOptions.GroupIndex := 0;
BtnShift.SpeedButtonOptions.Down := False;
BtnShift2.SpeedButtonOptions.Down := False;
end
else
begin
BtnShift.SpeedButtonOptions.GroupIndex := 2;
BtnShift2.SpeedButtonOptions.GroupIndex := 3;
BtnShift.SpeedButtonOptions.Down := True;
BtnShift2.SpeedButtonOptions.Down := True;
end;
Key := 0;
CaptionUpperAndLower(BtnShift.SpeedButtonOptions.Down or CapsLockStatus);
end;
end;
procedure TFrmKlavye.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_SHIFT then
begin
BtnShift.SpeedButtonOptions.GroupIndex := 0;
BtnShift2.SpeedButtonOptions.GroupIndex := 0;
BtnShift.SpeedButtonOptions.Down := False;
BtnShift2.SpeedButtonOptions.Down := False;
CaptionUpperAndLower(BtnShift.SpeedButtonOptions.Down or CapsLockStatus);
end;
end;
procedure TFrmKlavye.FormShow(Sender: TObject);
begin
Left := xLeftShow;
Top := xTopShow;
if CapsLockStatus then
begin
BtnCapsLock.SpeedButtonOptions.GroupIndex := 1;
BtnCapsLock.SpeedButtonOptions.Down := True;
end;
if ShiftStatus then
begin
BtnShift.SpeedButtonOptions.GroupIndex := 2;
BtnShift2.SpeedButtonOptions.GroupIndex := 2;
BtnShift.SpeedButtonOptions.Down := True;
BtnShift2.SpeedButtonOptions.Down := True;
end;
CaptionUpperAndLower(CapsLockStatus or ShiftStatus);
end;
procedure TFrmKlavye.SetCapsLockStatus(const ACapsLock:Boolean);
begin
if ACapsLock then
begin
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end
else
begin
Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
procedure TFrmKlavye.SetShiftStatus(const AShift: Boolean);
begin
if AShift then
Keybd_Event(VK_SHIFT, 0, 0, 0)
else
begin
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
BtnShift.SpeedButtonOptions.GroupIndex := 0;
BtnShift2.SpeedButtonOptions.GroupIndex := 0;
BtnShift.SpeedButtonOptions.Down := False;
BtnShift2.SpeedButtonOptions.Down := False;
CaptionUpperAndLower(False);
end;
end;
function TFrmKlavye.ShiftStatus: Boolean;
begin
Result := GetKeyState(VK_SHIFT) < 0;
end;
procedure TFrmKlavye.BtnCapsLockClick(Sender: TObject);
begin
SetCapsLockStatus(not CapsLockStatus);
end;
procedure TFrmKlavye.BtnHideClick(Sender: TObject);
Var xBtn : TcxButton;
Key : Integer;
Extra : DWord;
begin
xBtn := TcxButton(Sender);
if xBtn = BtnHide then
begin
Close;
if xForm <> nil then
begin
xForm.Top := (Screen.Height - xForm.Height) div 2;
end;
end
else if xBtn = BtnSlash then
begin
Keybd_Event(VK_SHIFT, 0, 0, 0);
keybd_event(55, MapvirtualKey(55, 0), 0, 0);
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnYildiz then
keybd_event(223, MapvirtualKey(223, 0), 0, 0)
else if xBtn = BtnBackSpace then
keybd_event(VK_BACK, MapvirtualKey(VK_BACK, 0), 0, 0)
else if xBtn = BtnTab then
keybd_event(VK_TAB, MapvirtualKey(VK_TAB, 0), 0, 0)
else if xBtn = BtnEnter then
begin
keybd_event(13, MapvirtualKey(13, 0), 0, 0);
Keybd_Event(13, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnNokta then
keybd_event(190, MapvirtualKey(190, 0), 0, 0)
else if xBtn = BtnVirgul then
keybd_event(188, MapvirtualKey(188, 0), 0, 0)
else if xBtn = BtnSpace then
keybd_event(32, MapvirtualKey(32, 0), 0, 0)
else if xBtn = BtnNoktaliVirgul then
begin
Keybd_Event(VK_SHIFT, 0, 0, 0);
keybd_event(188, MapvirtualKey(188, 0), 0, 0);
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnEt then
begin
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_MENU, 0, 0, 0);
keybd_event(81, MapvirtualKey(81, 0), 0, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnUnlem then
begin
Keybd_Event(VK_SHIFT, 0, 0, 0);
keybd_event(49, MapvirtualKey(49, 0), 0, 0);
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnYuzde then
begin
Keybd_Event(VK_SHIFT, 0, 0, 0);
keybd_event(53, MapvirtualKey(53, 0), 0, 0);
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnParantezAc then
begin
Keybd_Event(VK_SHIFT, 0, 0, 0);
keybd_event(56, MapvirtualKey(56, 0), 0, 0);
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnParantezKapat then
begin
Keybd_Event(VK_SHIFT, 0, 0, 0);
keybd_event(57, MapvirtualKey(57, 0), 0, 0);
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnTirnak then
keybd_event(192, MapvirtualKey(192, 0), 0, 0)
else if xBtn = BtnSoruIsareti then
begin
Keybd_Event(VK_SHIFT, 0, 0, 0);
keybd_event(223, MapvirtualKey(223, 0), 0, 0);
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end
else if xBtn = BtnTre then
keybd_event(189, MapvirtualKey(189, 0), 0, 0)
else if xBtn = BtnAltTre then
begin
Keybd_Event(VK_SHIFT, 0, 0, 0);
keybd_event(189, MapvirtualKey(189, 0), 0, 0);
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end
else
begin
if (xBtn.Caption = 'İ') or (xBtn.Caption = 'i') then
Key := 222
else
Key := VkKeyScan(Char(xBtn.Caption[1]));
Extra := 0;
keybd_event(Key, MapVirtualKey(Key, 0), Extra, 0);
keybd_event(Key, MapVirtualKey(Key, 0), Extra or KEYEVENTF_KEYUP, 0);
end;
if not CapsLockStatus then
begin
BtnShift.SpeedButtonOptions.GroupIndex := 0;
BtnShift2.SpeedButtonOptions.GroupIndex := 0;
BtnShift.SpeedButtonOptions.Down := False;
BtnShift2.SpeedButtonOptions.Down := False;
Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
CaptionUpperAndLower(BtnShift.SpeedButtonOptions.Down);
end;
end;
procedure TFrmKlavye.BtnShiftClick(Sender: TObject);
begin
SetShiftStatus(not BtnShift.SpeedButtonOptions.Down);
end;
procedure TFrmKlavye.WMMouseActivate(var Message: TWMMouseActivate);
begin
Message.Result := MA_NOACTIVATE;
end;
end.
Masaüstü Uygulamalar İçin Özel Bir Klavye - klavye - 20-04-2019 Elinize Sağlık Masaüstü Uygulamalar İçin Özel Bir Klavye - engerex - 20-04-2019 Darısı Android'e. Masaüstü Uygulamalar İçin Özel Bir Klavye - mcuyan - 20-04-2019 Gayet başarılı bir çalışma. Nacizane bir önerim olabilir mi acaba?.. % simgesi yerine + koysanız nasıl olur acaba.. Çünki % pek sık kullanılmazken + çok daha fazla kullanılır gibime geliyor. Masaüstü Uygulamalar İçin Özel Bir Klavye - faktoral - 20-04-2019 Emeğinize sağlık. uses SKLib, StrLib; Dosyaya bunları eklemeyi unutmuş olabilirmisiniz? Cvp: Masaüstü Uygulamalar İçin Özel Bir Klavye - narkotik - 20-04-2019 (20-04-2019, Saat: 20:02)faktoral Adlı Kullanıcıdan Alıntı: Emeğinize sağlık. Linki güncelledim, düzeldi (20-04-2019, Saat: 18:46)mcuyan Adlı Kullanıcıdan Alıntı: Gayet başarılı bir çalışma. Nacizane bir önerim olabilir mi acaba?.. ![]() Shift ile destekleniyor Masaüstü Uygulamalar İçin Özel Bir Klavye - shooterman - 21-04-2019 @narkotik Dosyanızı bir türlü indiremiyorum. Adresi bulunduğu bölgede truva atı nedeni ile bloklama yapıyor sistem. Farklı bir lokasyona da yükleme şansınız var mı dosyayı. Cvp: Masaüstü Uygulamalar İçin Özel Bir Klavye - narkotik - 21-04-2019 (21-04-2019, Saat: 14:00)wiseman Adlı Kullanıcıdan Alıntı: @narkotik Alternatif Link Cvp: Masaüstü Uygulamalar İçin Özel Bir Klavye - Fesih ARSLAN - 22-04-2019 Emek ve katkılarınızdan dolayı teşekkür ederim. Alternatif bir link daha: Klavye - (DelphiCan) |