2012-05-06 20 views
0

=)SendInputマウス入力とキーボード入力の送信

windows7ノートパソコンでC++(VC++ではない)を使用しています。

マウスx/yを現在の位置から移動する方法に問題があります。マウスイベントの送信入力を呼び出すたびに、マウスを動かすだけでなく、画面(Fn + F2に相当)をオフにします。私は、プログラムをデバッグしていないだけでmikihiは値(これは、x = 25のためだった、yは25とabsolure =偽=)を持っていなかったことに気づいた:私は気を設定しようとした

mi: 
     dx   25 
     dy   25 
     mouseData  0 
     dwFlags  1 
     time   2686400 
     dwExtraInfo 0 
    ki: 
     wVk   25 
     wScan   0 
     dwFlags  25 
     time   0 
     dwExtraInfo 1 
    hi: 
     uMsg   25 
     wParamL  25 
     wParamH  0  

をし、HI 0にしますが、もし私がそれを行うと、miも0に設定され、マウスは動かなくなりますが、画面はまだスリープ状態になります! :$

私が使用した方法のいくつかを以下に示します。

int Controller::mouse_move(long x, long y, bool absolute) { 
    mouse.dx = x; 
    mouse.dy = y; 

    if (absolute) { 
     mouse.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; 
    }else{ 
     mouse.dwFlags = MOUSEEVENTF_MOVE; 
    } 

    mouse.mouseData = 0; 
    mouse.dwExtraInfo = 0; 

    input.type = INPUT_MOUSE; 
    input.mi = mouse; 

    SendInput(1, &input, sizeof (input)); 

    return 0; 
} 

OR

int Controller::mouse_move(long x, long y, bool absolute, int index_vector_no) { 
    input.type = INPUT_MOUSE; 
    input.mi.dx = x; 
    input.mi.dy = y; 

    if (absolute) { 
     input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; 
    }else{ 
     input.mi.dwFlags = MOUSEEVENTF_MOVE; 
    } 

    input.mi.mouseData = 0; 
    input.mi.dwExtraInfo = 0; 

    input.ki.dwExtraInfo = 0; 
    input.ki.dwFlags = 0; 
    input.ki.time = 0; 
    input.ki.wScan = 0; 
    input.ki.wVk = 0; 

    input.hi.uMsg = 0; 
    input.hi.wParamH = 0; 
    input.hi.wParamL = 0; 

    SendInput(1, &input, sizeof (input)); 

    return 0; 
} 

これはキーボード入力だけでなく、マウスを送信している理由は誰の事をことができます!私のラップトップの設定と関係がありますか?

ありがとうございます! =)

+1

ki、mi、およびhiはユニオンです – chris

+0

私は彼らが推測していたかもしれないが、なぜそれが私の画面をオフにしているのか説明していない! :/型フラグはINPUT_MOUSEに設定されているので、マウスイベントだけにしてください! – geekman92

+3

'mi.time'を0に設定しましたか?私はそれをしないときに奇妙な結果を得た。 – chris

答えて

3

他人が変わる理由は、それらがすべて組合に入っているためです。したがって、それらは同じメモリを共有します。

画面がオフになっているため、mi.timeは0に設定されていないため、初期化されていません。これらの構造体を{0}に初期化することをお勧めしますので、物事を忘れないようにしてください。タイムスタンプは乱数になり、ディスプレイにタイムアウトが発生する可能性があります。

+0

もう一度、本当に私を混乱させてくれた! =) – geekman92

1

あなたはこれを使用することができます:

input.mi.time = 0; 

前:

input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP; 

それは私のために動作します。

関連する問題