Multi Monitor mit der WinAPI



  • Sind die Koordinaten der einzige Weg zu erkennen auf welchem physikalischen Monitor sich die Maus befindet? Oder hat die WinAPI hier noch eine Funktion auf Lager? Ich möchte erkennen wenn die Maus sich dort befindet bzw einen Monitor betritt oder verlässt.

    Ich kann das natürlich mit den Mauskoordinaten machen, aber das dürfte relativ komplex werden, vor allem wenn man verschiedene Reihenfolgen der Monitore und Monitore im Portrait Modus beachten muss.

    Ich suche hier einen Ansatz.



  • Ich würde einfach MonitorFromPoint benutzen



  • y schrieb:

    Ich würde einfach MonitorFromPoint benutzen

    Danke Dir! Ich denke das vereinfacht das ganze extrem.



  • Ich hab das jetzt soweit. Allerdings habe ich ein neues Problem und ich wollte keinen neuen Thread machen.

    Die Fehlermeldung: http://i.imgur.com/wMnexpS.png
    Es ist entweder die, oder "The Device is not functioning properly".
    Das letzte mal als das kam hat es mir sogar den anderen Monitor ausgeschaltet und ich musste den ausstecken um ihn wieder in Windows erkannt zu bekommen. Ausschalten hat nicht gereicht. Jetzt die Gretchenfrage, wieso?

    Minimal Code:

    bool DoesMonitorSupportBrightness(void* hMonitor)
    {
        DWORD dwCapabilities;
        DWORD dwColors;
        DWORD cPhysicalMonitors;
        LPPHYSICAL_MONITOR pPhysicalMonitors = NULL;
        bool bRetCode = false;
    
        // Get the number of physical monitors.
        BOOL bSuccess = GetNumberOfPhysicalMonitorsFromHMONITOR(
                        reinterpret_cast<HMONITOR>(hMonitor), 
                        &cPhysicalMonitors
                        );
    
        if (bSuccess)
        {
            // Allocate the array of PHYSICAL_MONITOR structures.
            pPhysicalMonitors = (LPPHYSICAL_MONITOR)malloc(
                                cPhysicalMonitors* sizeof(PHYSICAL_MONITOR));
    
            if (pPhysicalMonitors != NULL)
            {
                // Get the array.
                bSuccess = GetPhysicalMonitorsFromHMONITOR(reinterpret_cast<HMONITOR>(hMonitor), cPhysicalMonitors, pPhysicalMonitors);
    
                if (GetMonitorCapabilities(pPhysicalMonitors->hPhysicalMonitor, &dwCapabilities, &dwColors))
                {
                    bRetCode = (dwCapabilities & MC_CAPS_BRIGHTNESS);
                }
                else
                {
                    //wxMessageBox(GetLastErrorAsString(), wxMessageBoxCaptionStr, wxOK | wxICON_HAND);
                }
    
                // Close the monitor handles.
                bSuccess = DestroyPhysicalMonitors(cPhysicalMonitors, pPhysicalMonitors);
    
                // Free the array.
                free(pPhysicalMonitors);
            }
        }
        return bRetCode;
    }
    

    Ich versuche nur herauszufinden, ob die Monitore es unterstützen, per WinAPI die Helligkeit zu ändern. Wenn ja, dann will ich diese dynamisch ändern. Die alternative Methode wäre es, ein transparentes Bild über den Monitor zu legen und diese so zu beeinflussen, aber das dürfte weniger Erfolg bringen.

    Gibt es noch andere Methoden?





  • Mr C schrieb:

    http://stackoverflow.com/questions/21177900/mouse-wrapping-in-multi-monitor-environments

    Das obige Problem trat auf, da Videokartentreiber scheinbar die Informationen nicht richtig transportieren und ich immer korrupte DCC Nachrichten bekomme. Der richtige Ansatz war, über CreateFile ein Handle auf den Monitor zu öffnen und den Monitor über DeviceIoControl zu steuern.

    Aber, die Monitor Rects werden ja schon über EnumMonitors mitgeteilt, ausserdem gibt es einen einfacheren Weg:

    //---------------------------------------------------------------
    bool Win32Monitor::IsMouseOnPrimaryMonitor(wxPoint pt, const AppOptions& options)
    //---------------------------------------------------------------
    {
        POINT mouseCoords;
        HMONITOR hMonitor;
        MONITORINFOEX monitorInfo;    
    
        mouseCoords.x = pt.x;
        mouseCoords.y = pt.y;
    
        hMonitor = MonitorFromPoint(mouseCoords, MONITOR_DEFAULTTONEAREST);
    
        if (hMonitor != NULL)
        {                    
             monitorInfo.cbSize = sizeof(MONITORINFOEX);
            GetMonitorInfo(hMonitor, &monitorInfo);
    
            if (wxString(monitorInfo.szDevice) == options.optPrimaryMonitor)
            {
                return true;
            }
        }
        return false;
    }
    

Log in to reply