
みなさま、いつも参考にさせていただいております。
今回はちょっと行きづまってしまいましたのでご存知の方、よろしくお願いいたします。
早速ですが、当方開発環境はVisualStudio2008にて行っております。
具体的にはテンキーのキーを操作するwindowsアプリを作成しているのですが、
テンキーを操作する事ができません。
NumLockがOFFの時にテンキーの2・4・6・8の矢印を操作したいのですが、
どうしても操作ができません。
NumLockがOFFの時に、テンキーの2・4・6・8を押したときどんな反応がでるかと、
KeyPressにて見ようと思ったのですが、イベントすら発動しませんでした。
これは操作できないと言うことなのでしょうか?
どなたかご存知の方ご享受くださいませ。
No.4ベストアンサー
- 回答日時:
こんばんは。
補足頂きました。当方はDirectInputで入力するのはチョッと経験がないので、分からないのですが、keybd_event()APIを使用すれば、簡単に出来ます。
http://msdn.microsoft.com/ja-jp/library/cc364822 …
本当はSendInput()APIを推奨しているのですが、今回はkeybd_event()APIの方で割愛させて頂きます。
http://msdn.microsoft.com/ja-jp/library/cc411004 …
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX.DirectInput;
using DirectInput = Microsoft.DirectX.DirectInput;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
const int VK_NUMLOCK = 0x90;
const int VK_NUMPAD2 = 0x62;
const int VK_NUMPAD4 = 0x64;
const int VK_NUMPAD6 = 0x66;
const int VK_NUMPAD8 = 0x68;
const int EVENT_KEYBOARD = 0;
const int EVENT_EXIT = 1;
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool GetKeyboardState(byte [] lpKeyState);
//此れを追加
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
delegate void KeyboardDeleggate();
KeyboardDeleggate kbDelegate;
System.Threading.Thread thread;
Device directInput;
System.Threading.WaitHandle[] handles = new System.Threading.WaitHandle[2];
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.handles[EVENT_KEYBOARD] = new System.Threading.AutoResetEvent(false);
this.handles[EVENT_EXIT] = new System.Threading.AutoResetEvent(false);
this.directInput = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard);
this.directInput.SetEventNotification(handles[EVENT_KEYBOARD]);
this.directInput.Acquire();
this.kbDelegate = new KeyboardDeleggate(this.CheckKeyboard);
this.thread = new System.Threading.Thread(this.KeyboardProc);
this.thread.Start();
}
public void CheckKeyboard()
{
byte[] bufKeyState = new byte[256];
GetKeyboardState(bufKeyState);
if (bufKeyState[VK_NUMLOCK] != 0)
return;
KeyboardState keyState = directInput.GetCurrentKeyboardState();
if (keyState[DirectInput.Key.NumPad2])
{
//押した
keybd_event(VK_NUMPAD2, 0, 0, (UIntPtr)0);
//離した
keybd_event(VK_NUMPAD2, 0, 2, (UIntPtr)0);
}
if (keyState[DirectInput.Key.NumPad4])
{
keybd_event(VK_NUMPAD4, 0, 0, (UIntPtr)0);
keybd_event(VK_NUMPAD4, 0, 2, (UIntPtr)0);
}
if (keyState[DirectInput.Key.NumPad6])
{
keybd_event(VK_NUMPAD6, 0, 0, (UIntPtr)0);
keybd_event(VK_NUMPAD6, 0, 2, (UIntPtr)0);
}
if (keyState[DirectInput.Key.NumPad8])
{
keybd_event(VK_NUMPAD8, 0, 0, (UIntPtr)0);
keybd_event(VK_NUMPAD8, 0, 2, (UIntPtr)0);
}
}
public void KeyboardProc()
{
bool bLoop = true;
while (bLoop)
{
int result = System.Threading.WaitHandle.WaitAny(handles, 200, false);
switch (result)
{
case EVENT_KEYBOARD: Invoke(kbDelegate);
break;
case EVENT_EXIT: bLoop = false;
break;
case System.Threading.WaitHandle.WaitTimeout:
break;
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
System.Threading.AutoResetEvent exitEvent = this.handles[EVENT_EXIT] as System.Threading.AutoResetEvent;
exitEvent.Set();
this.thread.Join();
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
//ココに来るはず
MessageBox.Show(e.KeyChar.ToString());
}
}
}
おぉぉ!!
できました!!!
大変参考になりました。
直接コードをいただいてしまって大変恐縮ですm(__)m
ありがとうございました♪
No.3
- 回答日時:
こんばんは。
DirectXのDirectInputを使用すれば可能です。DirectXの導入については以下を参照。
http://www.clks.jp/csg/dx002.html
以下はNUMLOCKがOFFの時だけ2,4,6,8を検出してメッセージボックスを表示します。改善の余地もあるかとは思いますが、参考程度に。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX.DirectInput;
using DirectInput = Microsoft.DirectX.DirectInput;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
const int VK_NUMLOCK = 0x90;
const int EVENT_KEYBOARD = 0;
const int EVENT_EXIT = 1;
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool GetKeyboardState(byte [] lpKeyState);
delegate void KeyboardDeleggate();
KeyboardDeleggate kbDelegate;
System.Threading.Thread thread;
Device directInput;
System.Threading.WaitHandle[] handles = new System.Threading.WaitHandle[2];
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//イベントの作成
this.handles[EVENT_KEYBOARD] = new System.Threading.AutoResetEvent(false);
this.handles[EVENT_EXIT] = new System.Threading.AutoResetEvent(false);
//DirectInputの作成
this.directInput = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard);
this.directInput.SetEventNotification(handles[EVENT_KEYBOARD]);
this.directInput.Acquire();
//デリゲートの作成
this.kbDelegate = new KeyboardDeleggate(this.CheckKeyboard);
//スレッドを回す
this.thread = new System.Threading.Thread(this.KeyboardProc);
this.thread.Start();
}
public void CheckKeyboard()
{
//NUMLOCKの状態を確認
byte[] bufKeyState = new byte[256];
GetKeyboardState(bufKeyState);
//NUMLOCKがONなので引き返す
if (bufKeyState[VK_NUMLOCK] != 0)
return;
//DirectInputで2,4,6,8キーを検出
KeyboardState keyState = directInput.GetCurrentKeyboardState();
if (keyState[DirectInput.Key.NumPad2])
{
MessageBox.Show("2");
}
if (keyState[DirectInput.Key.NumPad4])
{
MessageBox.Show("4");
}
if (keyState[DirectInput.Key.NumPad6])
{
MessageBox.Show("6");
}
if (keyState[DirectInput.Key.NumPad8])
{
MessageBox.Show("8");
}
}
public void KeyboardProc()
{
//200ミリ秒でイベント待ち
bool bLoop = true;
while (bLoop)
{
int result = System.Threading.WaitHandle.WaitAny(handles, 200, false);
switch (result)
{
//キー入力があった
case EVENT_KEYBOARD: Invoke(kbDelegate);
break;
//スレッドを終了しろと言われた
case EVENT_EXIT: bLoop = false;
break;
//タイムアウトした
case System.Threading.WaitHandle.WaitTimeout:
break;
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//スレッドを止める為のイベントをシグナル化
System.Threading.AutoResetEvent exitEvent = this.handles[EVENT_EXIT] as System.Threading.AutoResetEvent;
exitEvent.Set();
this.thread.Join();
}
}
}
この回答への補足
machongola 様
びっくりしました!
参考コードまで載せていただき、大変参考になりました。
ありがとうございます。
一点、お聞きしたいのですが、上記コードでNumLockがOFFの時に
DirectXを用いて2・4・6・8をプッシュするにはどの様なコードが
あるのでしょうか?
よろしくお願いいたします。
No.1
- 回答日時:
KeyPressでは、矢印キー等を検知する事は出来ません。
以下を参考にどうぞ。
http://dobon.net/vb/dotnet/control/btndetectarra …
参考URL:http://dobon.net/vb/dotnet/control/btndetectarra …
この回答への補足
早々のご回答ありがとうございます。
大変に参考になったのですが、主旨として、やりたい事は、
NumLockがOFFの時にテンキーの2・4・6・8の矢印をDownしたいのです。
可能なのでしょうか?
よろしく願致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- マウス・キーボード テンキーが 動きかない 1 2022/11/16 04:30
- Windows 10 (緊急)windowsのタスクバーやアプリ?が反応しない 3 2023/03/28 05:03
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Windows 10 ファイルエクスプローラーでフォルダを閉じる操作について 2 2022/10/15 11:06
- アニメ グレンラガンの操縦は、グレンとラガンに乗った二人の内、どっちが何をやっているのでしょうか。 1 2022/06/20 19:31
- マウス・キーボード real vnc viewer で遠隔先で操作が出来ない。 2 2023/07/24 15:00
- 電子レンジ・オーブン・トースター 電子レンジの非科学的(カルト的)動作の原因について考えられる理由を知りたい 8 2022/11/29 14:47
- アプリ Edgeを操作するアプリについて 4 2023/05/11 22:48
- Windows 10 Windows10でボリュームのアップダウンを簡単にできる方法ないですか? 1 2023/06/20 13:06
- Word(ワード) Word文書のドラッグ操作による配置調整。 1 2022/10/16 19:24
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
static constメンバ変数(配列)...
-
ソケット通信時のWSACleanup処...
-
プログラミング教えてください
-
二重定義の回避法
-
既定のコンストラクタがありま...
-
C++にてtemplateで受け取った任...
-
C#でテンキーの操作は可能でし...
-
_beginthreadにて発生するコン...
-
リージョンのフレームを描画す...
-
関数名の名前の衝突について。
-
C言語 extern について
-
メッセージマップ(ON_CONTROL_...
-
関数の戻り値にその関数のポイ...
-
int main()、void main()、void...
-
カノニカルモードの設定について
-
CTabCtrl:TABインデックス単位...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
数字以外が入力されたらエラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
const_castのつかいどころを教...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
_beginthreadにて発生するコン...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
【VC++6.0】イベントハンドラ関...
-
pictureboxの画像を削除するには?
おすすめ情報