動機
今回はボタン一つで何か処理をする・表示するというものではなく、キーボードから入力されたキー情報をデスクトップアプリ上に表示させようと思います。
動機は、キーロガーを実装することで、今後私が計画している便利アプリに組み込めるのではないかと思ったためです。
本アプリは WindowsFormsApp で作成しました。
過去の記事(WpfApp)
参考 1:ノートパソコンの画面の明るさをボタン一つで変更する【C#】
参考 2:ノートパソコンの画面の音量をボタン一つで変更する【C#】
参考 3:ノートパソコンの画面のバッテリー状況をボタン一つで取得する【C#】
参考 4:ノートパソコンの画面の通信料状況をボタン一つで取得する【C#】
参考 5:ノートパソコンで現在使用中のアプリをボタン一つで把握する【C#】
参考 6: ノートパソコンで現在使用中のオーディオ機器情報をボタン一つで取得する【C#】
参考 7:パソコンのユーザー情報取得やアプリ起動・終了、ディスプレイ画面の切替などを、ボタンを作って動かす【C#】
過去の記事(WindowsFormsApp)
イメージ画像
UI はプロトタイプのため、特にこだわりはありません。
キーボードから入力された文字が表示されるだけの、シンプルな UI となっております。
今回のアプリでは、キーボードから入力された文字(アルファベット、数字、Ctrl キー、Shift キー、alt キーなど)が、本アプリ上に表示されます。
ソース
Form1.Designer.cs
Form1.Designer.cs
namespaceWindowsFormsApp1{partialclassForm1{/// <summary>/// 必要なデザイナー変数です。/// </summary>privateSystem.ComponentModel.IContainercomponents=null;/// <summary>/// 使用中のリソースをすべてクリーンアップします。/// </summary>/// <param name="disposing">マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>protectedoverridevoidDispose(booldisposing){if(disposing&&(components!=null)){components.Dispose();}base.Dispose(disposing);}#regionWindowsフォームデザイナーで生成されたコード/// <summary>/// デザイナー サポートに必要なメソッドです。このメソッドの内容を/// コード エディターで変更しないでください。/// </summary>privatevoidInitializeComponent(){this.labelKey=newSystem.Windows.Forms.Label();this.labelShift=newSystem.Windows.Forms.Label();this.labelCtrl=newSystem.Windows.Forms.Label();this.labelAlt=newSystem.Windows.Forms.Label();this.label1=newSystem.Windows.Forms.Label();this.label2=newSystem.Windows.Forms.Label();this.SuspendLayout();//// labelKey//this.labelKey.AutoSize=true;this.labelKey.Font=newSystem.Drawing.Font("MS UI Gothic",48F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((byte)(128)));this.labelKey.Location=newSystem.Drawing.Point(426,37);this.labelKey.Name="labelKey";this.labelKey.Size=newSystem.Drawing.Size(226,80);this.labelKey.TabIndex=0;this.labelKey.Text="label1";this.labelKey.Click+=newSystem.EventHandler(this.labelKey_Click);//// labelShift//this.labelShift.AutoSize=true;this.labelShift.Font=newSystem.Drawing.Font("MS UI Gothic",48F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((byte)(128)));this.labelShift.Location=newSystem.Drawing.Point(426,172);this.labelShift.Name="labelShift";this.labelShift.Size=newSystem.Drawing.Size(226,80);this.labelShift.TabIndex=1;this.labelShift.Text="label2";this.labelShift.Click+=newSystem.EventHandler(this.labelShift_Click);//// labelCtrl//this.labelCtrl.AutoSize=true;this.labelCtrl.Font=newSystem.Drawing.Font("MS UI Gothic",48F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((byte)(128)));this.labelCtrl.Location=newSystem.Drawing.Point(426,252);this.labelCtrl.Name="labelCtrl";this.labelCtrl.Size=newSystem.Drawing.Size(226,80);this.labelCtrl.TabIndex=2;this.labelCtrl.Text="label3";this.labelCtrl.Click+=newSystem.EventHandler(this.labelCtrl_Click);//// labelAlt//this.labelAlt.AutoSize=true;this.labelAlt.Font=newSystem.Drawing.Font("MS UI Gothic",48F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((byte)(128)));this.labelAlt.Location=newSystem.Drawing.Point(426,332);this.labelAlt.Name="labelAlt";this.labelAlt.Size=newSystem.Drawing.Size(226,80);this.labelAlt.TabIndex=3;this.labelAlt.Text="label4";this.labelAlt.Click+=newSystem.EventHandler(this.labelAlt_Click);//// label1//this.label1.AutoSize=true;this.label1.Font=newSystem.Drawing.Font("MS UI Gothic",19.8F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((byte)(128)));this.label1.Location=newSystem.Drawing.Point(106,69);this.label1.Name="label1";this.label1.Size=newSystem.Drawing.Size(305,34);this.label1.TabIndex=4;this.label1.Text="キーボード入力文字:";//// label2//this.label2.AutoSize=true;this.label2.Font=newSystem.Drawing.Font("MS UI Gothic",19.8F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((byte)(128)));this.label2.Location=newSystem.Drawing.Point(74,293);this.label2.Name="label2";this.label2.Size=newSystem.Drawing.Size(337,34);this.label2.TabIndex=5;this.label2.Text="Ctrl, Shift or Alt 判定:";//// Form1//this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,12F);this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;this.ClientSize=newSystem.Drawing.Size(800,450);this.Controls.Add(this.label2);this.Controls.Add(this.label1);this.Controls.Add(this.labelAlt);this.Controls.Add(this.labelCtrl);this.Controls.Add(this.labelShift);this.Controls.Add(this.labelKey);this.Name="Form1";this.Text="Form1";this.Load+=newSystem.EventHandler(this.Form1_Load);this.ResumeLayout(false);this.PerformLayout();}#endregionprivateSystem.Windows.Forms.LabellabelKey;privateSystem.Windows.Forms.LabellabelShift;privateSystem.Windows.Forms.LabellabelCtrl;privateSystem.Windows.Forms.LabellabelAlt;privateSystem.Windows.Forms.Labellabel1;privateSystem.Windows.Forms.Labellabel2;}}Form1.cs
Form1.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Diagnostics;usingSystem.Drawing;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceWindowsFormsApp1{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();labelKey.Text="";labelShift.Text="";labelCtrl.Text="";labelAlt.Text="";}KeyboardHookkeyboardHook=newKeyboardHook();protectedoverridevoidOnLoad(EventArgse){keyboardHook.KeyDownEvent+=KeyboardHook_KeyDownEvent;keyboardHook.KeyUpEvent+=KeyboardHook_KeyUpEvent;keyboardHook.Hook();}// A-Zキーが押されているときは非0が入るintAtoZ=0;privatevoidKeyboardHook_KeyDownEvent(objectsender,KeyEventArge){KeysConverterkc=newKeysConverter();if(e.KeyCode>=65&&e.KeyCode<=90){AtoZ=e.KeyCode;labelKey.Text=kc.ConvertToString(e.KeyCode);}elseif(e.KeyCode==160||e.KeyCode==161)labelShift.Text="Shift";elseif(e.KeyCode==162||e.KeyCode==163)labelCtrl.Text="Ctrl";elseif(e.KeyCode==164||e.KeyCode==165)labelAlt.Text="Alt";elselabelKey.Text=kc.ConvertToString(e.KeyCode);}privatevoidKeyboardHook_KeyUpEvent(objectsender,KeyEventArge){KeysConverterkc=newKeysConverter();if(e.KeyCode>=65&&e.KeyCode<=90&&AtoZ==e.KeyCode){AtoZ=0;labelKey.Text="";}elseif(e.KeyCode==160||e.KeyCode==161)labelShift.Text="";elseif(e.KeyCode==162||e.KeyCode==163)labelCtrl.Text="";elseif(e.KeyCode==164||e.KeyCode==165)labelAlt.Text="";elseif(AtoZ==0)labelKey.Text="";elselabelKey.Text=kc.ConvertToString(AtoZ);}protectedoverridevoidOnFormClosing(FormClosingEventArgse){keyboardHook.UnHook();}privatevoidlabelAlt_Click(objectsender,EventArgse){}privatevoidlabelShift_Click(objectsender,EventArgse){}privatevoidlabelKey_Click(objectsender,EventArgse){}privatevoidlabelCtrl_Click(objectsender,EventArgse){}privatevoidForm1_Load(objectsender,EventArgse){}}classKeyboardHook{protectedconstintWH_KEYBOARD_LL=0x000D;protectedconstintWM_KEYDOWN=0x0100;protectedconstintWM_KEYUP=0x0101;protectedconstintWM_SYSKEYDOWN=0x0104;protectedconstintWM_SYSKEYUP=0x0105;[StructLayout(LayoutKind.Sequential)]publicclassKBDLLHOOKSTRUCT{publicuintvkCode;publicuintscanCode;publicKBDLLHOOKSTRUCTFlagsflags;publicuinttime;publicUIntPtrdwExtraInfo;}[Flags]publicenumKBDLLHOOKSTRUCTFlags:uint{KEYEVENTF_EXTENDEDKEY=0x0001,KEYEVENTF_KEYUP=0x0002,KEYEVENTF_SCANCODE=0x0008,KEYEVENTF_UNICODE=0x0004,}[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrSetWindowsHookEx(intidHook,KeyboardProclpfn,IntPtrhMod,uintdwThreadId);[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)][return:MarshalAs(UnmanagedType.Bool)]privatestaticexternboolUnhookWindowsHookEx(IntPtrhhk);[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrCallNextHookEx(IntPtrhhk,intnCode,IntPtrwParam,IntPtrlParam);[DllImport("kernel32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrGetModuleHandle(stringlpModuleName);privatedelegateIntPtrKeyboardProc(intnCode,IntPtrwParam,IntPtrlParam);privateKeyboardProcproc;privateIntPtrhookId=IntPtr.Zero;publicvoidHook(){if(hookId==IntPtr.Zero){proc=HookProcedure;using(varcurProcess=Process.GetCurrentProcess()){using(ProcessModulecurModule=curProcess.MainModule){hookId=SetWindowsHookEx(WH_KEYBOARD_LL,proc,GetModuleHandle(curModule.ModuleName),0);}}}}publicvoidUnHook(){UnhookWindowsHookEx(hookId);hookId=IntPtr.Zero;}publicIntPtrHookProcedure(intnCode,IntPtrwParam,IntPtrlParam){if(nCode>=0&&(wParam==(IntPtr)WM_KEYDOWN||wParam==(IntPtr)WM_SYSKEYDOWN)){varkb=(KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam,typeof(KBDLLHOOKSTRUCT));varvkCode=(int)kb.vkCode;OnKeyDownEvent(vkCode);}elseif(nCode>=0&&(wParam==(IntPtr)WM_KEYUP||wParam==(IntPtr)WM_SYSKEYUP)){varkb=(KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam,typeof(KBDLLHOOKSTRUCT));varvkCode=(int)kb.vkCode;OnKeyUpEvent(vkCode);}returnCallNextHookEx(hookId,nCode,wParam,lParam);}publicdelegatevoidKeyEventHandler(objectsender,KeyEventArge);publiceventKeyEventHandlerKeyDownEvent;publiceventKeyEventHandlerKeyUpEvent;protectedvoidOnKeyDownEvent(intkeyCode){KeyDownEvent?.Invoke(this,newKeyEventArg(keyCode));}protectedvoidOnKeyUpEvent(intkeyCode){KeyUpEvent?.Invoke(this,newKeyEventArg(keyCode));}}publicclassKeyEventArg:EventArgs{publicintKeyCode{get;}publicKeyEventArg(intkeyCode){KeyCode=keyCode;}}}おわりに
今回はボタン一つで何かする、というものではなかったのですが、今後の便利アプリにうまい具合に組み込めていければいいなと思っています。
誰かのお役に立てれば幸いです。
