手持ちのほかのキーボードではScrLkとkは小文字だったから、どっちでもいいんだろうけど。
ScrollLockのKeyなのか?
どうでもいいか。
そんな感じでいつだかに言っていたスクリーンキーボードを作成しているのだけど、
SendInput()でscanCode指定をすればDirectXなアプリケーションにも対応できると検索に出てきたものの、
実際にやってみると全然反応しない。
KeyDownとKeyUpの間にSleepを入れるといいとも見かけたので試してみたがやっぱり反応せず。
なんなんだー? ってがちゃがちゃやってたらあるときたまたまキー入力に反応。
あれこれためしてみたところ、KeyDownからKeyUpまでが早すぎると入力をキャッチできないらしく、
Sleep( 50 )ぐらいにしたらばっちり反応するようになった。
たいていのゲームでは60FPSだろうから16msも押しっぱにすれば反応するようになると思われる。
そういえばXPのときはSleepの精度が10ms間隔ぐらいだったのが、ゲームの速度を一定に保つ際に問題になったものだけど、 Windows8だとどうなってるんだろうか。あとでためしてみよう。
#includeといったコードで、Sleep(1)をしたときの様子を観察した。#include #include int main() { std::vector< char > buffer; buffer.resize( 1024 * 1024 ); FILE* file = NULL; file = fopen( "sleepTest.txt", "w"); if ( file ) { { LARGE_INTEGER frequency; QueryPerformanceFrequency( &frequency ); LARGE_INTEGER lastTime; QueryPerformanceCounter( &lastTime ); for (int i=0; i<100; ++i) { LARGE_INTEGER nowTime; QueryPerformanceCounter( &nowTime ); LONGLONG ns = ( (nowTime.QuadPart - lastTime.QuadPart) * (1000 * 1000) ) / frequency.QuadPart; char str[ 128 ] = {0}; sprintf( str, "[%d] %llu ns (%d ms)\n", i, ns, static_cast (ns/1000) ); strcat( &buffer[0], str ); Sleep( 1 ); lastTime = nowTime; } } fwrite( &buffer[0], strlen(&buffer[0])+1, 1, file ); fclose( file ); file = NULL; } return 0; }
XP:
8:[0] 0 ns (0 ms) [1] 6750 ns (6 ms) [2] 15622 ns (15 ms) [3] 15623 ns (15 ms) [4] 15629 ns (15 ms) [5] 15620 ns (15 ms) [6] 15648 ns (15 ms) [7] 15599 ns (15 ms) [8] 15625 ns (15 ms) [9] 15623 ns (15 ms) [10] 15626 ns (15 ms) [11] 15624 ns (15 ms) [12] 15617 ns (15 ms) [13] 15625 ns (15 ms) [14] 15623 ns (15 ms) [15] 15624 ns (15 ms) ...
ってな感じで、何やら差が出た。[0] 0 ns (0 ms) [1] 1027 ns (1 ms) [2] 2023 ns (2 ms) [3] 1984 ns (1 ms) [4] 1997 ns (1 ms) [5] 1999 ns (1 ms) [6] 2000 ns (2 ms) [7] 2002 ns (2 ms) [8] 2003 ns (2 ms) [9] 2030 ns (2 ms) [10] 1970 ns (1 ms) [11] 2001 ns (2 ms) [12] 1999 ns (1 ms) [13] 2003 ns (2 ms) [14] 2001 ns (2 ms) [15] 1034 ns (1 ms) ...
Windows8では心置きなくSleep(1)で速度調整してもいいんじゃないかな。
0 件のコメント:
コメントを投稿