WindowsアプリケーションをC++で開発しています。
キーイベントを取得するには、まずはWM_KEYDOWNを取得。
もっと早く知りたい場合は、グローバルフック。
さらに早く知りたい場合は、KeyboardFilterDriverを開発...
このようにしてWindowsのキー入力について深堀してきたのですが、ハードからのキー入力をどのようにソフトで処理しているのか、一連の流れがつかめません。
ハードからカーネル、ドライバ、ユーザーランド、ユーザーアプリケーション....といったキー入力の一連の流れを詳しく教えてはいただけないでしょうか。
目的は、ユーザーランド側(システムではない方)でいち早くキー入力を取得したいのです。
ドライバ開発からすればシステムの一部としてキー入力を取得できるかもしれませんが、それではアプリケーションを利用できる層は限られています。(管理者でないといけない)
なので、キー入力の仕組みをきちんと理解して、キー入力を取得できるようにしたいのです。
よろしくお願いします。
Windowsのキー入力について教えてください
Re: Windowsのキー入力について教えてください
Windowsのメッセージをコンソールに出力するプログラムです。
VisualStudio2019Community で
実行してみました。
http://www2.koyoen.birdview.co.jp/~abcx ... -20-a-.PNG
Windows10のにはDirectXが採用されています。
この質問箱の管理人さんのページにhttps://dixq.net/g/02_09.html
説明があります。
なを 詳しいことはここに問い合わせてください。
https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
static FILE *fp;
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI _tWinMain
(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
wc.style =0;
wc.lpfnWndProc =WindowProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInstance;
wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName =NULL;
wc.lpszClassName=TEXT("Form1Class");
if(RegisterClass(&wc)==0)
return 0;
hwnd=CreateWindow( TEXT("Form1Class"),
TEXT("Form1"),
WS_OVERLAPPEDWINDOW,
10,
50,
300,
200,
NULL,
(HMENU)NULL,
hInstance,
0);
if(hwnd==NULL)
return 0;
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
///////////////////////////////////////////
//コンソールを作成し,標準出力に割り当てる
AllocConsole();
freopen_s(&fp,"CON", "w", stdout);
////////////////////////////////////////////
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
/////////////////////////////////////////////////
//コンソールを作成し,標準入出力に割り当てている
printf(" message = %d",message);
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
///////////////////////////////////////////////////////////////////////////////
実行してみました。
http://www2.koyoen.birdview.co.jp/~abcx ... -20-a-.PNG
Windows10のにはDirectXが採用されています。
この質問箱の管理人さんのページにhttps://dixq.net/g/02_09.html
説明があります。
なを 詳しいことはここに問い合わせてください。
https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?
-
- 記事: 26
- 登録日時: 6年前
Re: Windowsのキー入力について教えてください
ありがとうございます。
示していただいたプログラムですが、このプログラムの場合ウィンドウに送られてきたメッセージを処理しているだけ(WM_KEYDOWNなど)です。
このメッセージは、キーが押されてから様々なプログラム(ドライバなど)を通過してようやく送られてきたものだと思います。
これでは遅すぎるといいますか、もっと早くキー入力を検出したいのです。(フックよりも早く)
なので、Windowsのキー入力の仕組みを理解したいと思っています。
Dxライブラリを紹介していただいていますが、これもライブラリの一種であり、Windowsのキー入力の仕組みとは関係ないと存じます。
示していただいたプログラムですが、このプログラムの場合ウィンドウに送られてきたメッセージを処理しているだけ(WM_KEYDOWNなど)です。
このメッセージは、キーが押されてから様々なプログラム(ドライバなど)を通過してようやく送られてきたものだと思います。
これでは遅すぎるといいますか、もっと早くキー入力を検出したいのです。(フックよりも早く)
なので、Windowsのキー入力の仕組みを理解したいと思っています。
Dxライブラリを紹介していただいていますが、これもライブラリの一種であり、Windowsのキー入力の仕組みとは関係ないと存じます。
Re: Windowsのキー入力について教えてください
そういう事はここに聞くといいとおもいますね。私も会員です。其のころ600万のエンジニアの会員がいたのです。
https://stackoverflow.com/
https://stackoverflow.com/