Linuxのu入力

Linux Uinput は、ユーザー入力イベントをシミュレートするカーネル ドライバーです。これにより、ユーザー空間プログラムは、仮想入力デバイス ノードを作成することによって、シミュレートされた入力イベントを生成できます。これらのイベントには、キーボード、マウス、タッチ スクリーン、またはその他の入力デバイス イベントが含まれます。さらに、Uinput は仮想入力デバイスのさまざまなプロパティを設定することもでき、入力イベントのフィルタリングと変更をサポートします。

Linux Uinput ドライバーを使用すると、スクリプトの自動化、キーボード ショートカットの作成、ゲーム コントローラー、仮想タッチスクリーンなどの興味深い機能が有効になります。

ドライバーを使用するにはuinput、カーネル構成のオプションを有効にしCONFIG_INPUT_UINPUT、関連する API を使用してユーザー空間で仮想入力デバイスを作成および操作する必要があります。詳細と例については、Linux カーネルのドキュメントの関連セクションを参照するか、uinputオンラインでコード例を検索してください。
ここに画像の説明を挿入
Linux の uinput (ユーザー入力) は、入力デバイス イベントをシミュレートすることでアプリケーションがシステムと対話できるようにするユーザー空間入力サブシステムです。uinput を使用すると、仮想入力デバイスを作成し、キーの押下、マウスの動き、タッチ スクリーン イベントなどのさまざまな入力イベントをシステムに送信できます。

いくつかの便利な機能は、uinput を使用して実現できます。

  1. 自動テスト: 仮想入力デバイスを作成し、ユーザー入力イベントをシミュレートすることにより、アプリケーションのユーザー インターフェイス (UI) と対話フローのテストを自動化できます。

  2. リモート コントロール: 物理デバイスからリモート システムへの入力イベントの転送により、ローカル コンピューター上の別のコンピューターの入力操作をリモート コントロールできます。

  3. ゲーム コントローラー エミュレーション: 仮想ゲームパッドまたはゲーム キーボードを作成することで、実際のハードウェア デバイスを必要とせずに、ゲーム コントローラーからの入力イベントをシミュレートします。

uinput を使用するには、次の手順が必要です。

  1. /dev/uinputuinput デバイスを開く:デバイス ファイルを開き、ioctlシステム コールを使用して uinput デバイスのプロパティを設定します。

  2. 仮想デバイス情報の設定:ioctlシステム コールを使用して、デバイス名、機能、イベント タイプなどの仮想デバイスのプロパティを構成します。

  3. 入力イベントの送信:writeシステム コールを使用して入力イベントを uinput デバイス ファイルに書き込み、ユーザー入力操作をシミュレートします。

  4. uinput デバイスを閉じる: 使用が終了したら、/dev/uinputデバイス ファイルを閉じます。

単純な Linux uinput の例:

uinput を使用して仮想入力デバイスを作成し、キー押下イベントをシミュレートする方法を示します。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/uinput.h>

int main() {
    
    
    int uinput_fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    if (uinput_fd < 0) {
    
    
        perror("无法打开 /dev/uinput");
        return 1;
    }

    // 设置uinput设备的属性
    struct uinput_user_dev uidev;
    ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);
    ioctl(uinput_fd, UI_SET_KEYBIT, KEY_A);
    ioctl(uinput_fd, UI_SET_KEYBIT, KEY_B);

    memset(&uidev, 0, sizeof(uidev));
    strncpy(uidev.name, "Virtual Keyboard", UINPUT_MAX_NAME_SIZE);
    uidev.id.bustype = BUS_USB;
    uidev.id.vendor  = 0x1234; // 自定义厂商ID
    uidev.id.product = 0x5678; // 自定义产品ID
    write(uinput_fd, &uidev, sizeof(uidev));

    ioctl(uinput_fd, UI_DEV_CREATE);

    // 模拟按键事件
    struct input_event ev;
    memset(&ev, 0, sizeof(ev));
    gettimeofday(&ev.time, NULL);

    ev.type = EV_KEY;
    ev.code = KEY_A;
    ev.value = 1; // 按下 A 键
    write(uinput_fd, &ev, sizeof(ev));

    ev.code = KEY_A;
    ev.value = 0; // 松开 A 键
    write(uinput_fd, &ev, sizeof(ev));

    ev.code = KEY_B;
    ev.value = 1; // 按下 B 键
    write(uinput_fd, &ev, sizeof(ev));

    ev.code = KEY_B;
    ev.value = 0; // 松开 B 键
    write(uinput_fd, &ev, sizeof(ev));

    // 销毁uinput设备
    ioctl(uinput_fd, UI_DEV_DESTROY);
    close(uinput_fd);

    return 0;
}

この例は C で書かれていることに注意してください。コンパイル時に、-luinput オプションを使用して uinput ライブラリをリンクする必要があります。たとえば、gcc でコンパイルするには次のようにします。

gcc -o uinput_example uinput_example.c -luinput

コンパイルされた実行可能ファイルが実行されるとuinput_example、「A」キーと「B」キーを押したり放したりする入力イベントがシミュレートされます。アプリケーションの出力を確認するか、実際のデバイスを使用して、シミュレートされたイベントが機能することを確認できます。

おすすめ

転載: blog.csdn.net/weixin_37787043/article/details/131169936
おすすめ