2007年10月7日日曜日

入力キー表示


「劇あれ」っていうディスプレイ録画ソフトがあるっぽい。ということは、NHKのテレビみたいなパソコン操作説明に使えるのではないかな?と思ってよく見てみたのですが、キーボードやマウスボタン入力は画面に表示しないみたい。
じゃあ、ということでネットで探してみても入力キーやマウスをフックして画面表示するものはなかなか見当たらない。(まんまキーロガーや、PC操作リプレイや、リアルタイム入力履歴表示のソフトはあったけど、履歴表示ではなく単純に入力操作をリアルタイムに表示するだけのフリーソフトがみつからない。)
まあ、自分のぐぐ力を嘆いても仕方がないので、フリーっぽいライブラリからちゃちゃっと作ってみました。

やった手順は、こんな感じ。
1.Visual C# 2005 Express Edition をダウンロード&インストール
マイクロソフトのページから3時間かけてダウンロードしてインストール。

2.フック用のライブラリ入手。
 http://www.codeproject.com/csharp/globalsystemhook.asp
の、ページから、サイトにユーザ登録した後、
http://www.codeproject.com/csharp/GlobalSystemHook/SystemHooksCompiledOnly.zipをダウンロード。(ソース版の方は、Visual Studio2003 っぽいし、Visual C++がいるようなので落としてもコンパイルできない。)

3.Windowsアプリでプログラム作成。(末尾に貼り付けてるけど、この他には、参照設定でKennedy.ManagedHooks.dllを参照設定してます。とくに複雑なことはやってません。)

4.実行モジュール格納先フォルダにKennedy.ManagedHooks.dll,Kennedy.ManagedHooks.xml,SystemHookCore.dllの3ファイルをコピーして、実行モジュールを起動。

でとりあえず希望の物ができたみたい。(2重起動が防止されていなかったり、左のシフトON→右のシフトON→左のシフトOFFで、シフトが押していないという表示になってしまいますが、特に問題ないかな?)
キャプチャはこんな感じ。本当はAlt+PrintScreenを押してキャプチャしてるので、「Alt PrintScreen」と表示されているのだけれど、PrintScreenを表示前にキャプチャしているようです。

最後に、
5.「劇あれ」でデスクトップ録画→mpgファイルに保存。で完了。

で録画したものをみたら、大体5秒間隔に画面が変わるみたい。

・・・全然だめじゃん。おいらのPC遅すぎ。

そういえば、昔々業務で、マウスボタンをフックするプログラムを書いたのだけれどその時は、リリース後、AntiVirusソフトに「Virusの疑い」をかけられて大騒ぎになったことがあったなぁ。

今回はどうかな?Anti Virusソフトで実行モジュールのフォルダをスキャンしてみると。。。あれ?キーロガーと判断してくれない。

このdllってカーネル書き換えする類のものなのかも?

アルファベットを見ていると眠くなってしまうため、説明ページをちゃんと読めないのでよくわかりませんが。




----
Form1.cs
----
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using Kennedy.ManagedHooks;

namespace WindowsApplication1
{
public partial class PressedButtonDisplay : Form
{
private MouseHook mouseHook = null;
private KeyboardHook keyboardHook = null;
private List<keys> keyList = null;
private List<mouseevents> mouseButtonList= null;

public PressedButtonDisplay()
{
InitializeComponent();

mouseHook = new MouseHook();
mouseHook.MouseEvent += new MouseHook.MouseEventHandlermouseHook_MouseEvent);
keyboardHook = new KeyboardHook();
keyboardHook.KeyboardEvent += new KeyboardHook.KeyboardEventHandler(keyboardHook_KeyboardEvent);
keyList = new List<keys>();
mouseButtonList = new List<mouseevents>();

}

private void Form1_Load(object sender, EventArgs e)
{


mouseHook.InstallHook();
keyboardHook.InstallHook();

SetDesktopLocation(Screen.PrimaryScreen.WorkingArea.Width - Width, Screen.PrimaryScreen.WorkingArea.Height - Height);
}

private void mouseHook_MouseEvent(MouseEvents mEvent, Point point)
{
switch(mEvent)
{
case MouseEvents.LeftButtonDown:
case MouseEvents.RightButtonDown:
case MouseEvents.MouseWheel:
if (!mouseButtonList.Contains(mEvent)) mouseButtonList.Add(mEvent);
break;
case MouseEvents.RightButtonUp:
mouseButtonList.Remove(MouseEvents.RightButtonDown);
break;
case MouseEvents.LeftButtonUp:
mouseButtonList.Remove(MouseEvents.LeftButtonDown);
break;
case MouseEvents.Move:
mouseButtonList.Remove(MouseEvents.MouseWheel);
break;
default:
mouseButtonList.Clear();
break;
}
string afterText = "";
foreach (MouseEvents itme in mouseButtonList) afterText += itme.ToString().Replace("Down", "") + " ";
if (DisplayMouseButton.Text != afterText) DisplayMouseButton.Text = afterText;
}
private void keyboardHook_KeyboardEvent(KeyboardEvents kEvent, Keys key)
{
switch (kEvent)
{
case KeyboardEvents.KeyDown:
case KeyboardEvents.SystemKeyDown:
if (!keyList.Contains(key)) keyList.Add(key);
break;
case KeyboardEvents.KeyUp:
case KeyboardEvents.SystemKeyUp:
keyList.Remove(key);
break;
default:
keyList.Clear();
break;
}
string afterText = "";
foreach (Keys itk in keyList) afterText += itk.ToString() + " ";
if (DisplayInputKey.Text != afterText) DisplayInputKey.Text = afterText;
}
}
}



---
Form1.desiner.cs
----
namespace WindowsApplication1
{
partial class PressedButtonDisplay
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (mouseHook != null)
{
mouseHook.Dispose();
mouseHook = null;
}
if (keyboardHook != null)
{
keyboardHook.Dispose();
keyboardHook = null;
}
}
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows フォーム デザイナで生成されたコード

private void InitializeComponent()
{
this.DisplayMouseButton = new System.Windows.Forms.Label();
this.DisplayInputKey = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// DisplayMouseButton
//
this.DisplayMouseButton.AutoSize = true;
this.DisplayMouseButton.Font = new System.Drawing.Font("MS UI Gothic", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
this.DisplayMouseButton.Location = new System.Drawing.Point(12, 66);
this.DisplayMouseButton.Name = "DisplayMouseButton";
this.DisplayMouseButton.Size = new System.Drawing.Size(430, 48);
this.DisplayMouseButton.TabIndex = 0;
this.DisplayMouseButton.Text = "DisplayMouseButton";
//
// DisplayInputKey
//
this.DisplayInputKey.AutoSize = true;
this.DisplayInputKey.Font = new System.Drawing.Font("MS UI Gothic", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
this.DisplayInputKey.Location = new System.Drawing.Point(12, 9);
this.DisplayInputKey.Name = "DisplayInputKey";
this.DisplayInputKey.Size = new System.Drawing.Size(340, 48);
this.DisplayInputKey.TabIndex = 0;
this.DisplayInputKey.Text = "DisplayInputKey";
//
// PressedButtonDisplay
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(484, 123);
this.Controls.Add(this.DisplayInputKey);
this.Controls.Add(this.DisplayMouseButton);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "PressedButtonDisplay";
this.Opacity = 0.5;
this.Text = "PressedButtonDisplay";
this.TopMost = true;
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
this.PerformLayout();

}

#endregion

private System.Windows.Forms.Label DisplayMouseButton;
private System.Windows.Forms.Label DisplayInputKey;
}
}

0 件のコメント: