キーボードで、右側にあるテンキーの打ち間違いを無くすため、
NumLockを無効化する(押しても何もしない)プログラムを
作っております。
DLLを作り、API(SetWindowsHookExとLowLevelKeyBoardProc)を使用して
キーをフックしようと考えましたが、うまくフックできません。
キーボードのLEDランプ表示はちゃんと点灯しっぱなし、あるいは消えっぱなしに
なるのですが、動作的にはうまくいっていないのです。
Numlock以外のキー(例えばScrollLock、CapsLockなど)は無効化できたので、NumLockもできそうなのに。
(実際に実現できているツールも見たことがあります。)
どなたか知恵をお貸し下さい。
開発環境はWindows2000+Delphi6Personalです。
NumLockキーを無効にする参考用のテストプログラムを作成してみました.
DLLを使用してコードが長くなることと,説明が面倒なので,ダウンロード
形式としました.
(例によってコード内に説明を書いておきました)
http://homepage2.nifty.com/Mr_XRAY/Others/TempPage002.htm
一両日ぐらいは置いて置きますので,よろしかったら参考にしてください.
なお,キーフックを使用しなくても,数値キーをいつでも有効にすれば
いい,というのであれば,以下のコードでも可能です.
//====================================================================
// Fomr作成時にはNumLockをONに
//====================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
if NumLockKeyState=False then ChangeNumLockState;
end;
//====================================================================
// NumLockがOFFならONにしてから...
//====================================================================
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if NumLockKeyState=False then begin
ChangeNumLockState;
end;
//以降,他のキー操作
end;
//====================================================================
// NumLockキーの状態を検査
// True : NumLockがON
// False : NumLockがOFF
//====================================================================
function TForm1.NumLockKeyState: Boolean;
var
AKeyState:TKeyboardState;
begin
GetKeyboardState(AKeyState);
Result := Boolean(AKeyState[VK_NUMLOCK]);
end;
//====================================================================
// NumLockキーの状態を変更する(Windows NT系専用)
//====================================================================
procedure TForm1.ChangeNumLockState;
begin
keybd_event(VK_NUMLOCK, 0, 0, 0);
keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0);
end;
Mr.XRAYさん、ご指導ありがとうございます。
しかもテストプログラムまで用意して下さるとは...m(__)m
なかなか返信がつかず諦めていたところでしたので
大変感謝しております。
さっそくプログラムを拝見させていただきました。
しかし、私の説明不足だったのですが、
実は私が作りたいのは、「タスクトレイに常駐して、他の全てのアプリ(例えばメモ帳)でNumLockを無効にする」
タイプのソフトなのです。
Mr.XRAYさんのプログラムでは「DLL側でNumLockをフックし、
アプリ側でそれを検知し、Offの時に強制的にOnにする」という
ような実装の方法で、それだと例えばメモ帳では検知できません。
だったらDLL側で強制的にOnにすれば、と思い試行錯誤して
みましたが、うまくいきませんでした。
どうすれば良いでしょうか?
え〜と,ですね.
>だったらDLL側で強制的にOnにすれば、と思い試行錯誤して
>みましたが、うまくいきませんでした
実際どうやったのでしょうか.人のコードを解読するのは大変でしょうが.
がんばってね.(^^ゞ
先のURLで提供しているキーフックのDLLはグローバルなフックです.
したがって.DLL内のフックを動作させると,システム全体に作用するコード
も書けます.
先のテストプログラムでは,TForm1.WndProc でNumLockを制御していますが,
このコードをDLL内のNumLockを検出する部分に追加すれば,DLL内で制御できます.
再度そのようにしたDLLとテストプログラムのコードを同じURLにUPしましたので参考にしてください.テストプログラムを実行したら(最小化されます)
メモ帳などを起動して,NumLockが制御できることを確認してください.
常駐にする場合は... まっ,ご自分で考えてください,この過去ログにも
たしかあったと思います.ヒントはコード内に書いておきました.
では,がんばって下さい.何か不明な点があれば,他の識者からレスがあるでしょう.
ところで,私の職場に以前,ある専門学校卒の方で医療事務をやっていた方がいました.
その方は,左の親指にゴムサックをつけ,キーポードの左側に伝票の束をおいて,めくりながら,右手はテンキーだけで入力を,ものすごいスピードで
やっていました.何と,[NumLock]を解除してカーソル移動をしていました.
これを見てから,システム全体でNumLockをかけてしまうことに疑問を感じて
います.でも気持ちは理解できます.
私もよく,「数字が入力できない!!」と呼出されますから.
長文失礼しました.
忘れていました.常駐アプリということで,
もし,ホットキーを使用する場合,ホットキーの処理の中ではNumLokckの
処理をしないようにした方がいいと思います.多分動作不良となるでしょう(不正確情報).
できました。
Mr.XRAYさん、何度もありがとうございます。
このツールはあくまで自分用にと思っていたものなので
(自分がスラッシュや7とよく打ち間違うので...)
これで思う存分打ち間違えられます!ゞ(‾∇‾;)おいおい
しかしそのパンチャーさんはすごいですね。
>しかしそのパンチャーさんはすごいですね。
まだ20代前半の女性でした.今は出産で退職しました.
昔は,そのような人が結構いたようですよ.キーパンチャーが女性のあこ
がれであった時代もありましたから.
今は,ほとんどマウス操作の方がほとんどですね.業務アプリの入力も
[Enter]で項目移動できるようにしてあるのに,いちいちマウスで入力
位置を移動している人もいます(勘弁してくれ).
[Tab]操作はまったく覚えてくれません(泣).
ところで,ひろしさんは,お笑い界を引退してプログラマーに転向ですか.
(冗談です)
掲示板の過去ログを検索して,ない!! と,悲しいと考え,
NumLock制御のサンプルコード以下に移動しておきました.
コードも少し手を加えてあります.
http://homepage2.nifty.com/Mr_XRAY/Others/NumLock_WithDll.htm
ツイート | ![]() |