2009-11-24 3 views
2

J'ai perdu beaucoup d'heures à essayer de saisir exclusivement la souris dans mon application et de la relâcher.Récupérer exclusivement/libérer la souris dans l'application (Windows, C++)

En ce moment, je l'attrape correctement: le curseur de la souris disparaît de l'écran et je peux lire ses propriétés très bien.

Cependant, je ne peux pas le libérer correctement! Le curseur de la souris réapparaît à l'écran mais aucune autre application ne reçoit plus de clics de souris; sauf le mien.

Voici le code problématique:

IDirectInputDevice8* mMouse; 

void Win32Mouse::grab(bool grab) 
{ 
    if (mGrabMouse == grab) 
     return; 

    mMouse->Unacquire(); 

    if (grab) 
    { 
     // grab = true; seems to work fine 
     coopSetting &= ~DISCL_BACKGROUND; 
     coopSetting &= ~DISCL_NONEXCLUSIVE; 
     coopSetting |= DISCL_FOREGROUND | DISCL_EXCLUSIVE; 
    } 
    else 
    { 
     // grab = false; this surely isn't working as it should 
     coopSetting &= ~DISCL_FOREGROUND; 
     coopSetting &= ~DISCL_EXCLUSIVE; 
     coopSetting |= DISCL_BACKGROUND | DISCL_NONEXCLUSIVE; 
    } 

    if(FAILED(mMouse->SetCooperativeLevel(mHwnd, coopSetting))) { 
     std::cout << "Failed to set coop level\n"; 
    } 

    HRESULT hr = mMouse->Acquire(); 
    if (FAILED(hr) && hr != DIERR_OTHERAPPHASPRIO) { 
     std::cout << "Failed to aquire mouse!\n"; 
    } 

    mGrabMouse = grab; 
} 

Peut-être le problème que j'ai Windows7 ?!

Répondre

2

Peut-être à cause de cette
http://doc.51windows.net/Directx9_SDK/?url=/directx9_sdk/input/ref/ifaces/idirectinputdevice9/setcooperativelevel.htm
« » Une application qui acquiert le périphérique de la souris ou le clavier en mode exclusif doit toujours unacquire les appareils lorsque il reçoit les messages WM_ENTERSIZEMOVE et WM_ENTERMENULOOP.
Dans le cas contraire, l'utilisateur ne peut pas manipuler le menu ou déplacer et redimensionner la fenêtre. « »

peut être son pas tout à fait répondre
Mais aussi vérifier si vous peut être la souris ne unacquire sur d'autres messeges.
Par exemple sur WM_LOSTFOCUS, etc.

0

Vous pouvez essayer d'utiliser les appels API simples:

HMODULE hDll = LoadLibrary("magicfuncdll.dll"); 
HOOKPROC hookLowLevelMouseFilter = (HOOKPROC)GetProcAddress(hDll, "[email protected]"); 

// capture mouse events 
HHOOK hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, hookLowLevelMouseFilter, hDll, 0); 

... do your thing 

// release mouse 
UnhookWindowsHookEx(hMouseHook); 
Questions connexes