NumLockキーを無効化するには?

解決


ひろしです。  2004-09-28 19:09:36  No: 11174

キーボードで、右側にあるテンキーの打ち間違いを無くすため、
NumLockを無効化する(押しても何もしない)プログラムを
作っております。

DLLを作り、API(SetWindowsHookExとLowLevelKeyBoardProc)を使用して
キーをフックしようと考えましたが、うまくフックできません。
キーボードのLEDランプ表示はちゃんと点灯しっぱなし、あるいは消えっぱなしに
なるのですが、動作的にはうまくいっていないのです。
Numlock以外のキー(例えばScrollLock、CapsLockなど)は無効化できたので、NumLockもできそうなのに。
(実際に実現できているツールも見たことがあります。)
どなたか知恵をお貸し下さい。

開発環境はWindows2000+Delphi6Personalです。


Mr.XRAY  URL  2004-10-05 07:02:48  No: 11175

NumLockキーを無効にする参考用のテストプログラムを作成してみました.
DLLを使用してコードが長くなることと,説明が面倒なので,ダウンロード
形式としました.
(例によってコード内に説明を書いておきました)

http://homepage2.nifty.com/Mr_XRAY/Others/TempPage002.htm

一両日ぐらいは置いて置きますので,よろしかったら参考にしてください.


Mr.XRAY  URL  2004-10-05 07:31:01  No: 11176

なお,キーフックを使用しなくても,数値キーをいつでも有効にすれば
いい,というのであれば,以下のコードでも可能です.

//====================================================================
//  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;


ひろしです。  2004-10-05 20:08:10  No: 11177

Mr.XRAYさん、ご指導ありがとうございます。
しかもテストプログラムまで用意して下さるとは...m(__)m
なかなか返信がつかず諦めていたところでしたので
大変感謝しております。
さっそくプログラムを拝見させていただきました。

しかし、私の説明不足だったのですが、
実は私が作りたいのは、「タスクトレイに常駐して、他の全てのアプリ(例えばメモ帳)でNumLockを無効にする」
タイプのソフトなのです。

Mr.XRAYさんのプログラムでは「DLL側でNumLockをフックし、
アプリ側でそれを検知し、Offの時に強制的にOnにする」という
ような実装の方法で、それだと例えばメモ帳では検知できません。
だったらDLL側で強制的にOnにすれば、と思い試行錯誤して
みましたが、うまくいきませんでした。
どうすれば良いでしょうか?


Mr.XRAY  URL  2004-10-06 08:02:52  No: 11178

え〜と,ですね.

>だったらDLL側で強制的にOnにすれば、と思い試行錯誤して
>みましたが、うまくいきませんでした

実際どうやったのでしょうか.人のコードを解読するのは大変でしょうが.
がんばってね.(^^ゞ
先のURLで提供しているキーフックのDLLはグローバルなフックです.
したがって.DLL内のフックを動作させると,システム全体に作用するコード
も書けます.

先のテストプログラムでは,TForm1.WndProc でNumLockを制御していますが,
このコードをDLL内のNumLockを検出する部分に追加すれば,DLL内で制御できます.
再度そのようにしたDLLとテストプログラムのコードを同じURLにUPしましたので参考にしてください.テストプログラムを実行したら(最小化されます)
メモ帳などを起動して,NumLockが制御できることを確認してください.

常駐にする場合は...  まっ,ご自分で考えてください,この過去ログにも
たしかあったと思います.ヒントはコード内に書いておきました.

では,がんばって下さい.何か不明な点があれば,他の識者からレスがあるでしょう.

ところで,私の職場に以前,ある専門学校卒の方で医療事務をやっていた方がいました.
その方は,左の親指にゴムサックをつけ,キーポードの左側に伝票の束をおいて,めくりながら,右手はテンキーだけで入力を,ものすごいスピードで
やっていました.何と,[NumLock]を解除してカーソル移動をしていました.
これを見てから,システム全体でNumLockをかけてしまうことに疑問を感じて
います.でも気持ちは理解できます.

私もよく,「数字が入力できない!!」と呼出されますから.
長文失礼しました.


Mr.XRAY  URL  2004-10-06 08:17:51  No: 11179

忘れていました.常駐アプリということで,
もし,ホットキーを使用する場合,ホットキーの処理の中ではNumLokckの
処理をしないようにした方がいいと思います.多分動作不良となるでしょう(不正確情報).


ひろしです。  2004-10-06 19:39:39  No: 11180

できました。
Mr.XRAYさん、何度もありがとうございます。

このツールはあくまで自分用にと思っていたものなので
(自分がスラッシュや7とよく打ち間違うので...)
これで思う存分打ち間違えられます!ゞ(‾∇‾;)おいおい

しかしそのパンチャーさんはすごいですね。


Mr.XRAY  URL  2004-10-06 20:12:32  No: 11181

>しかしそのパンチャーさんはすごいですね。

まだ20代前半の女性でした.今は出産で退職しました.
昔は,そのような人が結構いたようですよ.キーパンチャーが女性のあこ
がれであった時代もありましたから.

今は,ほとんどマウス操作の方がほとんどですね.業務アプリの入力も
[Enter]で項目移動できるようにしてあるのに,いちいちマウスで入力
位置を移動している人もいます(勘弁してくれ).
[Tab]操作はまったく覚えてくれません(泣).

ところで,ひろしさんは,お笑い界を引退してプログラマーに転向ですか.
(冗談です)


Mr.XRAY  URL  2004-10-08 08:45:38  No: 11182

掲示板の過去ログを検索して,ない!! と,悲しいと考え,
NumLock制御のサンプルコード以下に移動しておきました.
コードも少し手を加えてあります.

http://homepage2.nifty.com/Mr_XRAY/Others/NumLock_WithDll.htm


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加