2012-01-01 9 views
0

ウィンドウで本当にマウスを移動させる方法がわかりました。ウィンドウを使ってマウス変位を得る方法(真)

たとえば、前のマウス位置の位置を保存し、新しい位置を要求し、前の位置から後者を減算することができます。しかし、これは私に本当のマウス変位を与えることはありません。

前のカーソル位置が画面解像度の最大x座標になり、ユーザーがマウスを右に動かしているとします。真のマウス変位を捕捉する方法はまだありますか?

おかげ

+1

へのリンクです。あなたは机の上でマウスの物理的な動きを意味しますか?いいえ、あなたはそれを知らないので、コンピュータはそれを知らないからです。マウスを動かすと、画面上にカーソルが移動します。あなたが決定できるのは、カーソルが画面上でどれだけ移動したかです。それがまっすぐであればどこでも動かず、物理的なマウスを机の上で右に動かします。 –

+0

@CodyGrayはい私は机の上のマウスの物理的な変位、または同様のものを意味します。たとえば、一人称シューティングゲームのPCゲームを見てみましょう。彼らは真のマウスの変位だけで、カメラを回転させる画面上のマウスの位置に依存しません。 – xcrypt

+0

方法があるかもしれませんそれはDirectInputを使用しています(私はそれを理解していますが、これはマウスにはお勧めできません)。一般的に、Windowsはマウスの動きをカーソルの動きに変換して処理するため、アプリケーションでは画面上のカーソルの位置が気になる必要があります。あなたが解決しようとしている問題ははっきりしていません。 –

答えて

-1

物理的なマウスを追跡することはできませんWindows APIでの置換ただし、DirectInputにはそれを追跡する機能があります。それはSOユーザーDXMの答えに小ぎれいなトリックを使用して、唯一のWindows APIを使用して、あなたがすることもでき「偽」

+0

WM_INPUTメッセージを使用しているときに純粋なWindows APIを使用することが可能なため、Downvoted。 – thewhiteambit

2

(すべてのマウス自体は移動のみではなく、場所を報告した後に)、それは実際にセンサデータを読み取ることが可能かもしれませんが、私はこれを行うことができるかを認識していませんよ。私は非常に低いレベルのウィンドウでは、ディスプレイスメント情報が画面上のカーソル位置に変換され、その後は常に画面解像度によって制限されると考えています。

何をしようとしていても、マウスカーソルはまだ表示されていますか?

少し前、私はExpression Blendでこれらのコントロールの動作を模倣したWPF数値編集ボックスコントロールを作成しました。編集ボックスからマウスをドラッグすると値が変更されます。私はあなたが見つけたのとまったく同じ問題に遭遇しました。私の解決策は、マウスカーソルを隠し、すべての目盛りで変位を検出し、カーソルを画面中央にリセットすることでした。その後、ユーザーがボタンを離してドラッグを止めると、ドラッグの前にカーソルを戻します。これは本当にうまくいっており、Expression Blendはカーソルを隠すときにもこのように動作します。

+0

ないマウスカーソルが私はそれを:)やろうとしています何に表示されません私はそれを試してみるよ、うまくいくだろう。 – xcrypt

1

私が知る限り、DirectXは周辺機器とやりとりするための独自のAPIを備えています。これはゲーム開発者におすすめです。あなたはそれを調べるべきです - たとえばDirectX 8 and the Mouseを試してください。詳細な文書はon MSDNです。

+1

http://msdn.microsoft.com/en-us/library/windows/desktop/ee416842(v=vs.85).aspx具体的には、「**キーボードとマウスの入力にDirectInputを使用することは推奨されません** 「 – Necrolis

+0

」の代わりにWindowsメッセージを使用してください。わからない理由はわかりませんが、納得いかない機能については驚くほど多くのサポートがあるようです(http://msdn.microsoft.com/en-私/ライブラリ/ windows/desktop/microsoft.directx_sdk.idirectinput8.idirectinput8.createdevice%28v = vs.85%29.aspxとにかくそれを完了させる唯一の方法だと思われます。 –

0

この種の変位? :http://en.wikipedia.org/wiki/Differential_calculus

てみピッチ/ヨー:How could simply calling Pitch() and Yaw() cause the camera to eventually Roll()?

FPSスタイル:http://cboard.cprogramming.com/game-programming/94944-mouse-input-aiming-fps-style-using-glut.html

と、この:Jittering when moving mouse

擬似コード:

int mouseX, mouseY;  
int oldMouseX, oldMouseY; 

while(game_is_Running) 
{ 
    oldMouseX = mouseX; 
    oldMouseY = mouseY; 

    mouseX = get_new_mouse_from_windows_X(); 
    mouseY = get_new_mouse_from_windows_Y(); 

    if ((mouseX - oldMouseX) > 0) 
    { 
     // mouse moved to the right 
    } 

    else if ((mouseX - oldMouseX) < 0) 
    { 
     // mouse moved to the left 
    } 



    if ((mouseY - oldMouseY) < 0) 
    { 
     // mouse moved down 


    } 

    else if ((mouseY - oldMouseY) > 0) 
    { 
     // mouse moved up 


    } 

} 
+2

いいえ、彼はこの種を意味しません;) –

+0

@Scott McIntyreこれは、私が話している変位ではありません。ここで問題となるのは、カーソルが画面の境界の1つに詰まっている可能性があり、ユーザがその方向にマウスを移動したい場合、何も起こりません。また、私は数学の仕組みを知っています:) – xcrypt

0

(ゲームで)このための一般的な方法:

ゲームのフレームごとに、取得オペレーティングシステム機能を使用してマウスの位置をマウスの位置に合わせてから、ウィンドウの中央にマウスを戻します。最初のフレーム以外のフレームでは、正確な変位情報が得られるはずです。キーはすべてのフレームをマウスの中央に戻すだけで、画面のブロック境界には決して到達しません。

EDIT:Woopsは、DXMがすでにこれを言っていたことを認識しませんでした。

0

最も信頼できる方法は、ウィンドウフックを使用することです。ここでは、hook_window_procedure();を呼び出してマウスをフックし、あなたがvoid LowLevelMouseProc(...)マウスが移動するたびに呼び出しを受信しますunhook_window_procedure();

を呼び出すことによって、それを外すことができますC(++)

LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam){ 
    MSLLHOOKSTRUCT* hookStruct = (MSLLHOOKSTRUCT*)lParam; 
    int ScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); 
    int ScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); 
    int x = hookStruct->pt.x * ScreenWidth/65536); 
    int y = hookStruct->pt.y * ScreenHeight/65536); 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

HHOOK LowLevelMouseProcHook = NULL; 

void hook_window_procedure() 
{ 
    if (LowLevelMouseProcHook == NULL) 
     LowLevelMouseProcHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)LowLevelMouseProc, (HINSTANCE)NULL, NULL);  
} 

void unhook_window_procedure() 
{ 
    if (LowLevelMouseProcHook != NULL) 
     UnhookWindowsHookEx(LowLevelMouseProcHook);  
} 

を使用してミニマリストのサンプルです。 lParamにはMSLLHOOKSTRUCTへのポインタが含まれており、構造体に必要なマウス情報がすべて見つかります。ここで最も興味深いのは、画面の1/65536と仮定して相対的なスクリーン座標にあるPOINT pt;です。 int ScreenWidthまたはint ScreenHeightと乗算して、画面の境界線によってクランプされている闘争場合は65536

で割ることにより、実画素にそれらを変換し、あなたのウィンドウの各コールの中心に戻ってマウスを設定し、回避策を行うことができます。これは古いゲームでよく見られます。 Windows APIのみを使用するように強制されていない場合は、直接入力を使用してみます。

もう一つの方法は、例えば、あなたのWindowProcに直接WM_INPUTを評価することでしょう。これは、ヒューマンインターフェイスデバイス(HID)スタックから直接データを読み取り、その中に生のMouse-Dataを持つ必要があります。ここで私は、私はあなたが「マウスの変位」によって何を意味するかを理解し、本当にわからないんだけどMS-Documentation

関連する問題