マウスカーソルの移動速度を変更する

SPECIAL


マウスカーソルの速度を変更する

Windows マウスカーソルの移動速度を調整するには、次の Windows API を利用する必要があるようです。

BOOL SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);

この API の uiAuction の値に対して SPI_GETMOUSESPEED = 0x70 または SPI_SETMOUSESPEED = 0x71 を渡すことで、pvParam の値を使って Int32 型の値を受け渡すことで、スピードの調整を行うことができるようになっています。その他の引数は、uiParam も fWinIni も 0 を渡しておきます。

 

これを C# で使用する場合、次のような関数定義となります。

[System.Runtime.InteropServices.DllImport("user32", SetLastError = true)]

public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni);

値を受け渡すための pvParam は IntPtr 型となるため、C# のようなポインターを意識しない言語ではどのように扱ったら良いのか迷うところではありますが、次の辺りを意識してプログラミングを行ってみたところ、どうやら上手く動いてくれました。

まず、SPI_SETMOUSESPEED で移動速度を設定する際は、IntPtr のコンストラクタで int 型を IntPtr 型に変換すれば良いので、特に難しい事はありませんでした。具体的には、pvParam の引数のところで "new IntPtr(mouse_speed)" というように指定すれば大丈夫です。

SPI_GETMOUSESPEED で移動速度を取得する場合には、アンマネージドコードを利用しないと行けないようです。int 型の変数を宣言したら、pvParam に対して、その変数のアドレスを渡すため、"new IntPtr((void*)&mouse_speed)" というようにします。ポインタを扱っているので、この処理をしているメソッドには "unsafe" キーワードを設定しておく必要があります。

このような辺りに気をつけてプログラミングを行えば、C# から Windows マウスカーソルの移動量を調整することができました。

 

C# でのマウスカーソルの速度を変更する関数の例

C# でマウスカーソルの速度を調整するような場合には、次のようなプログラムで実装することができました。

using System.Runtime.InteropServices;

 

public static class MouseSpeed

{

[DllImport("user32, SetLastError = true)]

private static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvVoid, uint fWinIni);

 

private const uint SPI_GETMOUSESPEED = 0x70;

private const uint SPI_SETMOUSESPEED = 0x71;

 

public static void Set(int speed)

{

if ( ! SystemParametersInfo(SPI_SETMOUSESPEED, 0, new IntPtr(speed), 0))

{

throw new Exception("マウスカーソルの速度を設定できませんでした。");

}

}

 

unsafe public static int Get()

{

int result;

 

if ( ! SystemParametersInfo(SPI_GETMOUSESPEED, 0, new IntPtr((void*)&result), 0))

{

throw new Exception("マウスカーソルの速度を取得できませんでした。");

}

 

return result;

}

}

注意すべき点としては、GetMouseSpeed メソッドは、ポインタを利用しているので、unsafe キーワードをメソッド宣言時に指定しています。また、これにともなって、コンパイルオプションでアンセーフコードを許可する必要があるといったくらいでしょうか。

ともあれ上記のようなコードを組めば、MouseSpeed.Set(10) とか、MouseSpeed.Get() といった形で、マウスカーソルの速度を変更することが出来るようになります。