Windowsのキー入力について教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DAICHI0922
記事: 26
登録日時: 1年前

Windowsのキー入力について教えてください

#1

投稿記事 by DAICHI0922 » 7ヶ月前

WindowsアプリケーションをC++で開発しています。

キーイベントを取得するには、まずはWM_KEYDOWNを取得。
もっと早く知りたい場合は、グローバルフック。
さらに早く知りたい場合は、KeyboardFilterDriverを開発...

このようにしてWindowsのキー入力について深堀してきたのですが、ハードからのキー入力をどのようにソフトで処理しているのか、一連の流れがつかめません。
ハードからカーネル、ドライバ、ユーザーランド、ユーザーアプリケーション....といったキー入力の一連の流れを詳しく教えてはいただけないでしょうか。

目的は、ユーザーランド側(システムではない方)でいち早くキー入力を取得したいのです。
ドライバ開発からすればシステムの一部としてキー入力を取得できるかもしれませんが、それではアプリケーションを利用できる層は限られています。(管理者でないといけない)
なので、キー入力の仕組みをきちんと理解して、キー入力を取得できるようにしたいのです。

よろしくお願いします。

Math

Re: Windowsのキー入力について教えてください

#2

投稿記事 by Math » 7ヶ月前

Windowsのメッセージをコンソールに出力するプログラムです。

コード:

#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);
}
///////////////////////////////////////////////////////////////////////////////
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?

DAICHI0922
記事: 26
登録日時: 1年前

Re: Windowsのキー入力について教えてください

#3

投稿記事 by DAICHI0922 » 7ヶ月前

ありがとうございます。

示していただいたプログラムですが、このプログラムの場合ウィンドウに送られてきたメッセージを処理しているだけ(WM_KEYDOWNなど)です。
このメッセージは、キーが押されてから様々なプログラム(ドライバなど)を通過してようやく送られてきたものだと思います。
これでは遅すぎるといいますか、もっと早くキー入力を検出したいのです。(フックよりも早く)
なので、Windowsのキー入力の仕組みを理解したいと思っています。

Dxライブラリを紹介していただいていますが、これもライブラリの一種であり、Windowsのキー入力の仕組みとは関係ないと存じます。

Math

Re: Windowsのキー入力について教えてください

#4

投稿記事 by Math » 7ヶ月前

そういう事はここに聞くといいとおもいますね。私も会員です。其のころ600万のエンジニアの会員がいたのです。
https://stackoverflow.com/

DAICHI0922
記事: 26
登録日時: 1年前

Re: Windowsのキー入力について教えてください

#5

投稿記事 by DAICHI0922 » 7ヶ月前

了解しました。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る