MouseWheel abfangen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von bazi.

    MouseWheel abfangen

    Hallo,
    in meinem Programm habe ich ein zugekauftes Control um PDF´s anzuzeigen. (Patagames PDF-Viewer).
    In diesem Viewer möchte ich nun mit MouseWheel den Bildausschnitt verschieben, was von Haus aus funktioniert, möchte aber auch wenn die [Strg] Taste gedrückt ist zoomen.
    Den Code für das Zoomen habe ich eingebaut, was auch funktioniert. Allerdings wird nun immer beim MouseWheel zusätzlich zum zoomen auch der Bildausschnitt verschoben.
    Das würde ich gerne unterbinden. Im MouseWheel das für das Control ankommt kann ich kein Handled = True oder ähnlich setzen um das abzubrechen.
    Ich kann zwar den Bildausschnitt wieder passend hinschieben, das führt aber zu einem unschönen Ruckeln.

    Hier Mausrad als Hotkey verwenden habe ich gelesen dass man mit einem Hook die Drehungen nicht mitbekommt, die ich aber zum zoomen bräuchte.
    Wie kann ich das lösen?

    Gruß Christian
    @bazi Da gibt es ggf. Untereschiede zwischen Win 7 und Win 10.
    Schau mal hier rein: stackoverflow.com/questions/33…eel-event-with-picturebox
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    bazi schrieb:

    dass man mit einem Hook die Drehungen nicht mitbekommt, die ich aber zum zoomen bräuchte.


    Also die Message kommt durchaus wenn ich einen MouseHook anwende. Ich kann die Message durchlassen oder auch nicht.
    Bilder
    • Unbenannt.png

      45,71 kB, 928×507, 35 mal angesehen
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Wenn nichts hilft, kannst du auch

    C#-Quellcode

    1. [DllImport("User32.dll")]
    2. public static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);

    benutzen und so den Key State erhalten. Wäre aber nicht die beste Lösung.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    In dem Fall ist der Hook richtig. Denn dann kann der TE die Message verschlucken, aber selbst drauf reagieren.

    SetWindowsHookEx
    UnhookWindowsHookEx
    CallNextHookEx

    HOOKPROC

    Sind Sachen die der TE sich mal anschauen muss.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Das Event im form , weis nicht ob du es da verschlucken kannst. Bei den Maus-Events sollte MosueEventArgs die Delta property haben. Beim hook kann man mit dem lParam Parameter und Marshal.PtrToStructure an ein MSLLHOOKSTRUCT kommen, damit dann auch an die Richtung in der gedreht wurde. Wenn du das Event nicht unetrdrücken kannst, musst du mit einem hook was machen. Aber mach das verünftig, so das nicht überall das scrollen verschluckt wird. Wenn du das verschluckst, kannst du solange auch nicht sonstwo scrollen, ist wie mausrad abschalten.

    @bazi
    PS.
    Wenn du dann mit GetAsyncKeyState testest ob STRG gedrückt ist, dazu das fensterhandle ermitteln, das mit GetActiveWindow abgleichen, wenn gleich nur dann verschlucken.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    also müsste ich im Hook

    VB.NET-Quellcode

    1. Private Shared Function MouseHookProc(ByVal nCode As Int32, ByVal wParam As IntPtr, ByRef lParam As MSLLHOOKSTRUCT) As Int32
    2. ' Debug.Print("Message = {0}, x={1}, y={2}", wParam.ToInt32, lParam.pt.X, lParam.pt.Y)
    3. RaiseEvent mEvent(wParam.ToInt32, lParam)
    4. Return CallNextHookEx(WH_MOUSE_LL, nCode, wParam, lParam)
    5. End Function
    die lParam auswerten.
    Ich probier das mal.
    Müsste dann im extra sein:

    VB.NET-Quellcode

    1. Public Structure MSLLHOOKSTRUCT
    2. Public pt As Point
    3. Public mouseData As Int32
    4. Public flags As Int32
    5. Public time As Int32
    6. Public extra As IntPtr
    7. End Structure
    Der Weg ist richtig. Wenn du anstatt CallNextHookEx einfach 1 zurück gibst, verschluckst du das. Also wie Mausrad-Drehung abschalten, du kannst aber selbst drauf reagieren. Das ist aber Systemweit. Also wie oben erwähnt, handle ermiteeln mit GetActiveWindow abgleichen, wenn dann noch STRG gedrückt kannste 1 zurückgeben.

    C#-Quellcode

    1. public int HookCallback(int nCode, int wParam, IntPtr lParam)
    2. {
    3. if(nCode >= 0)
    4. {
    5. if(wParam == WM_MOUSEWHEEL)
    6. {
    7. MSLLHOOKSTRUCT m = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
    8. short delta = (short)((m.mouseData >> 16) & 0xffff);
    9. Debug.WriteLine(delta);
    10. return 1;
    11. }
    12. }
    13. return NativeMethods.CallNextHookEx(hookHandle, nCode, wParam, lParam);
    14. }

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    evtl. hast du da was nicht richtig. Siehe im Anhang, die Ausgabe von meinem Snippet.

    PS.
    @bazi
    Deine Signatur von der Delegate-Function ist nicht richtig. Siehe bei mir.
    Bilder
    • Unbenannt.jpg

      246,45 kB, 787×735, 32 mal angesehen
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Danke für die Hilfe. Die Grundfunktion habe ich jetzt. Nun muss ich noch verfeinern dass nur auf ein bestimmtes Event geleitet wird wenn mein PDF-Viewer das aktive Control ist.
    Gruß Christian