2

XP/Vista/7 で動作するグローバル マウス フックを作成して、マウスが入力している X、Y 値にアクセスし、Windows にヒットする前にそれらの値を変更できるようにしようとしています...

また、実際のマウス入力の間にマウス入力をシミュレートできるようにしたい...

たとえば、入力が次のようになったとします。

1: 1,0 2: 2,0 3: 3,0 4: ?,?

入力番号 4 を傍受し、「if」ステートメントを実行できるようにしたい: 入力の値が特定のパラメーターと一致する場合、値を加算または減算して値を変更したい...

USB マウスのデフォルトのポーリング レートは 125Hz で、最大 1000Hz です...

可能であれば (特にポーリング レートが 1000hz 未満に設定されている場合)、実際のマウスの更新 (重要) の「間」で入力を「注入」したいので、たとえば:

(ミリ秒単位)

0008 - 1,0 0016 - 1,0 0032 - 2,0

そのため、マウスは 125Hz で更新されています... 入力の頻度を検出して、1 回おきに入力を送信できますか? したがって、たとえば、マウスの周波数を 125hz から 250hz に「2 倍」にして、設定したルールに基づいて「その間」の更新をシミュレートすることができます...

これらのどれかが合理的に見えますか? 現在、私はC#で作業しており、このチュートリアルの「Gma.UserActivityMonitor」を使用していました:http://www.codeproject.com/KB/cs/globalhook.aspxしかし、何らかの理由でパフォーマンスが低下しますフルスクリーン ゲームでこのコードを使用すると、フックが原因でマウス入力に使用できない遅延が発生します...

おそらく、C++ で何かを書く必要がありますか? どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

2

これは単純な C ライブラリであり、一般的な Windows API では動作しないゲームで動作します。

次のサンプルは、このライブラリを使用してマウスの動きを反転する方法を示しています。基本的には、垂直軸の変位に -1 を掛けるだけなので、反対方向に発生します。

#include <interception.h>
#include "utils.h" // for process priority control

enum ScanCode
{
    SCANCODE_ESC = 0x01
};

int main()
{
    InterceptionContext context;
    InterceptionDevice device;
    InterceptionStroke stroke;

    raise_process_priority();

    context = interception_create_context();

    interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP);
    interception_set_filter(context, interception_is_mouse, INTERCEPTION_FILTER_MOUSE_MOVE);

    while(interception_receive(context, device = interception_wait(context), &stroke, 1) > 0)
    {
        if(interception_is_mouse(device))
        {
            InterceptionMouseStroke &mstroke = *(InterceptionMouseStroke *) &stroke;

            if(!(mstroke.flags & INTERCEPTION_MOUSE_MOVE_ABSOLUTE)) mstroke.y *= -1;

            interception_send(context, device, &stroke, 1);
        }

        if(interception_is_keyboard(device))
        {
            InterceptionKeyStroke &kstroke = *(InterceptionKeyStroke *) &stroke;

            interception_send(context, device, &stroke, 1);

            if(kstroke.code == SCANCODE_ESC) break;
        }
    }

    interception_destroy_context(context);

    return 0;
}    

垂直方向の変位を反転する前に、INTERCEPTION_MOUSE_MOVE_ABSOLUTE フラグのチェックがあることがわかります。通常、オペレーティング システムは相対座標で動作しますが、仮想マシン内ではマウス座標が相対座標ではなく絶対座標で動作することを経験しました。簡単にするために、このサンプルでは相対変位のみを反転しています。

http://oblita.com/Interceptionで詳細なドキュメントを確認できます。

于 2012-02-16T20:05:45.983 に答える
1

生のマウス入力の取得に関するこのリンクが役立つことを願っています。C# 用に作成されたライブラリと C++ バージョンが含まれています。これは、Windows で複数のマウスを使用できるようにすることを目的としていますが、達成したい目的のために使用しているものをエミュレートできることを願っています。

于 2010-01-05T14:30:00.663 に答える