2013-06-26 8 views
7

SendInput()を使用してマウスの相対位置を送信しています。あなたが何をしている最初の病気あなた。SendInputを使用してマウスカーソルの位置を送信すると、画面が黒くなる

私はマウスを動かすために指を使います。だから私は640x480の画像で私の指を追跡し、画像でピクセルで絶対位置を取得します。

次に、send入力を使用して相対的なマウス位置コマンドを生成するために、その位置を次のメソッドに送信します。

指が左境界線(xlim1)または右境界線(xlim2)に移動すると、カーソルはどの限界値に応じて左右にスクロールしますか。 問題はコードを実行しているときで、カーソルが移動を開始すると画面が黒くなります。

iが他の部分IF(CX> = prevX & & CX> xlim2){...}セクションは、それが動作するコメント..(SO指点は、画像それカーソルの右限界に行きます左に水平スクロールを続けます。コメント部分は、左の水平スクロールを有効にします)。

これが初めての場合は、最初の変数がtrueになります。指をキャプチャします。それ以外の場合はfalseです。

void movMouse(int cx, int cy, bool first){ 
static int prevX = 0; 
static int prevY = 0; 

static int leftPrevX; 
static int rightPrevX; 

int mx,my; 

if(first == true){ 
    prevX = cx; 
    prevY = cy; 
} 
else{ 
    mx = (cx - prevX); 
    my = (cy - prevY); 

    if(cx <= prevX && cx < xlim1){ 
     mx = -20; 

     INPUT input; 
     input.type   = INPUT_MOUSE; 
     input.mi.mouseData = 0; 
     input.mi.dx   = -(mx); 
     input.mi.dy   = (my); 

     input.mi.dwFlags = MOUSEEVENTF_MOVE; 

     SendInput(1, &input, sizeof(input)); 
    } 
    else if(cx >= prevX && cx > xlim2){ 
     mx = 20; 

     INPUT input; 
     input.type   = INPUT_MOUSE; 
     input.mi.mouseData = 0; 
     input.mi.dx   = -(mx); 
     input.mi.dy   = (my); 

     input.mi.dwFlags = MOUSEEVENTF_MOVE; 

     SendInput(1, &input, sizeof(input)); 
    } 
    else { 
     INPUT input; 
     input.type   = INPUT_MOUSE; 
     input.mi.mouseData = 0; 
     input.mi.dx   = -(mx); 
     input.mi.dy   = (my); 

     input.mi.dwFlags = MOUSEEVENTF_MOVE; 

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

    prevX = cx; 
    prevY = cy; 
} 

}

+0

マウス入力の生成と「画面が黒くなる」の間に明白なつながりはありません。あなたのコードに欠陥があり、INPUT構造体を完全に初期化せず、MOUSEINPUT.timeと.dwExtraInfoの偽データを生成します。 INPUT input = {}; "このコードを呼んだ後で、妥当な遅れがあることを確認してください。 –

+0

それは働いていました!!!!!!!!!! .....うわー、私の人生を救った...ありがとう十分な!!!!!! ......... – user2389323

答えて

6

も、私がいても、それは私のために働いたinput.time を含むすべての変数:)

1

私はこれと同じ問題に遭遇したのintialize

ZeroMemory(&input,sizeof(input)); 

をお試しくださいZeroMemoryを呼び出して、他のすべてを正しく実行していました。私はinput.mi.timeを使用して、クリック間の間隔をWindowsに通知していました。ダブルクリックは正しく機能します。しかし、私はリモートコンピュータから '時間'の値を取得していました。彼らはローカルコンピュータの時間と異なっていたので、Windowsがスクリーンセーバーを起動させました!この問題を回避するために、私はコンピュータ間のスキューを検出し、値をある程度互いに一致させるためのロジックを追加しました。

要約:input.mi.timeがゼロまたはGetTickCount()にいくらか近い値であることを確認します。 ZeroMemoryを使用して変数を初期化することは、優れた提案です。

+0

ありがとうスクリーンセーバーとの接続を作るためにたくさん! –

関連する問題