Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Masaüstü Uygulamalar İçin Özel Bir Klavye
#1
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.

YQm6va.png

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.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#2
Elinize Sağlık
Cevapla
#3
Darısı Android'e.
Cevapla
#4
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.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#5
Emeğinize sağlık.

uses SKLib, StrLib;

Dosyaya bunları eklemeyi unutmuş olabilirmisiniz?
Cevapla
#6
(20-04-2019, Saat: 20:02)faktoral Adlı Kullanıcıdan Alıntı: Emeğinize sağlık.

uses SKLib, StrLib;  

Dosyaya bunları eklemeyi unutmuş olabilirmisiniz?

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?..

% simgesi yerine + koysanız nasıl olur acaba.. Çünki % pek sık kullanılmazken + çok daha fazla kullanılır gibime geliyor.

almnMg.png

Shift ile destekleniyor
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#7
@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ı.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#8
(21-04-2019, Saat: 14:00)wiseman Adlı Kullanıcıdan Alıntı: @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ı.

Alternatif Link
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#9
Emek ve katkılarınızdan dolayı teşekkür ederim. 
Alternatif bir link daha: Klavye - (DelphiCan)
DelphiCan'dır!
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi 11 için suiskin? Jakarta2 5 2.090 15-02-2024, Saat: 22:46
Son Yorum: Lraraujo23
  Ses Kayıt (Tüm Platformlar için) Fesih ARSLAN 13 9.837 19-04-2023, Saat: 18:12
Son Yorum: mrmarman
  Son Depremler (Tüm Platformlar için) Fesih ARSLAN 22 23.054 14-02-2023, Saat: 15:21
Son Yorum: TheEAK
  Müzik Player (Tüm Platformlar için) Fesih ARSLAN 3 6.243 22-05-2021, Saat: 20:35
Son Yorum: quiet1day
  Delphi 10.3 Rio için FGX bileşenleri Abdullah ILGAZ 12 16.547 19-02-2021, Saat: 17:04
Son Yorum: Abdullah ILGAZ



Konuyu Okuyanlar: 1 Ziyaretçi