Deaktiver museklik på visse områder af Windows-skærmen c # wpf

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en situation, hvor jeg gerne vil give fjernadgang til en klient ved hjælp af TightVNC for at give dem mulighed for at udføre nogle opgaver på en tredjeparts applikation.


Jeg vil kun tillade dem at klikke på visse dele af skærmen, f.eks. Deaktiver 'Luk' -knappen, med et par områder deaktiveret. Jeg spekulerede på, om der var en måde at programmere aflytte musen ned begivenheden på windows, og hvis de musen ned på et bestemt område bare vender tilbage i stedet for at udføre kliket? Eller hvis der er en måde at overlejre en gennemsigtig baggrund på, som altid er på forsiden af ​​skærmen på de valgte områder?


Min ansøgning er skrevet i WPF c # så hvis der er nogen eksempler for at opnå dette, ville det være meget værdsat. Jeg har forsøgt at skabe nogle dummy gennemsigtige vinduer, problemet er, at når brugeren klikker på den anden applikation, går de til baggrunden og dermed besejrer målet.


Tak på forhånd.

Bedste reference


Mulighed 1:



Du bør teknisk være i stand til at vedhæfte globale kroge til mushændelser og undertrykke dem, når du har brug for det. globalmousekeyhook er et af de biblioteker, der er til rådighed til at tildele handler (r) til mushændelser og undertrykke dem betinget ved at indstille e.Handled = true. [5] [6]


Mulighed 2:



Hvis du kun behøver at blokere mushændelser for bestemte applikationer - så kan du tilsidesætte deres WindowProc-metode til at filtrere eller undertrykke bestemte regionbaserede mushændelser. [7]


For eksempel til en Windows-formularapplikation , kan du bruge følgende kode til at deaktivere museklik i fjerde kvadrantområde i vinduet. (Bemærk: Denne kode skal tilføjes til den applikation, du forsøger at blokere adgang til)


public class Setup
{
    //call this method during application start/load
    public static bool Start()
    {
        Application.AddMessageFilter(new MessageFilter());
        return true;
    }
}

public class MessageFilter : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        // and use other params to determine mouse click location 
        switch (m.Msg)
        {
            case 0x201:
                //left button down 
                return IsInFourthQuadrant();//(filter the message and don't let app process it)
            case 0x202:
                //left button up, ie. a click
                break;
            case 0x203:
                //left button double click 
                return IsInFourthQuadrant(); //(filter the message and don't let app process it)
        }

        return false;
    }

    private static bool IsInFourthQuadrant()
    {
        var window = Application.OpenForms[0];
        var screen\_coords = Cursor.Position;

        var bounds = window.Bounds;
        var fourthQuadrant = new Rectangle(bounds.X + bounds.Width / 2, bounds.Y + bounds.Height / 2, bounds.Width / 2, bounds.Height / 2);

        return fourthQuadrant.Contains(screen\_coords);
    }
}


På samme måde kan du bruge følgende prøvekode til at deaktivere museklik i fjerde kvadrantområde i en WPF-applikation:


public class Setup
{
    public static bool Start()
    {
        HwndSource source = PresentationSource.FromVisual(Application.Current.MainWindow) as HwndSource;
        source.AddHook(WndProc);

        return true;
    }

    private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        switch (msg)
        {
            case 0x201:
                //left button down 
                handled = IsInFourthQuadrant();//(filter the message and don't let app process it)
                break;
            case 0x202:
                //left button up, ie. a click
                break;
            case 0x203:
                //left button double click 
                handled = IsInFourthQuadrant(); //(filter the message and don't let app process it)
                break;
        }

        return IntPtr.Zero;
    }

    private static bool IsInFourthQuadrant()
    {
        var window = Application.Current.MainWindow;
        var coords = Mouse.GetPosition(Application.Current.MainWindow);

        var fourthQuadrant = new Rect(window.Width / 2, window.Height / 2, window.Width / 2, window.Height / 2);

        return fourthQuadrant.Contains(coords);
    }
}


Mulighed 3:



Hvis du skal blokere museklik på bestemte eksisterende kørende processer, forudsat at målprogrammer bruger .NET med enten Windows-formateret UI eller WPF - så kan du indsprøjte dine .NET-enheder i den eksisterende proces/applikation og tilsidesætte dens [[WindowsProc adfærd som angivet i Mulighed 2 . Du kan også henvise denne prøvekode til det samme. [9]