Odchycení myši a klávesnice cizí aplikace   otázka

C#, VB.NET, WinForms

Zdravím, potřebuji pomoc, převod retro kódu do vb.net.

Function WndProc(ByVal hWnd As IntPtr, ByVal msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
           
            Const WM_LBUTTONDOWN As Integer = &H201
            Const WM_LBUTTONUP As Integer = &H202
            Const WM_LBUTTONDBLCLK As Integer = &H203
            
            Const WM_KEYDOWN As Integer = &H100
            Const WM_KEYUP As Integer = &H101
            Const WM_CHAR As Integer = &H102
            Const WM_SYSKEYDOWN As Integer = &H104

            Select Case msg
                Case WM_LBUTTONDOWN
                    Dim p As System.Drawing.Point = New System.Drawing.Point(lParam.ToInt32)
                    ClientToScreen(hWnd, p)

                Case WM_LBUTTONDBLCLK
  
                Case WM_KEYUP 


                Case Else

            End Select
    Return CallWindowProc(oldWndProc, hWnd, msg, wParam, lParam)
End Function

První dotaz se týká rozlišení zda se jedná o single click nebo double click, WM_LBUTTONUP nedostávám vůbec. Při pokusu spustění časovače při WM_LBUTTONDOWN pomocí funkcí SetTimer a KillTimer pro čekání na dvojkliknutí v době definované systémem cizí aplikace spadne.

Druhý dotaz se týká převodu wParam v událostech klávesnice na keydata tedy Keys (obdobně jako u myši lParam na Point), zde pro změnu dostávám pouze WM_KEYUP. Zda musím použít TranslateMessage, abych odchytil ALT,CTRL,SHIFT a KEYCODE. Nejlépe vyvolat z třídy vlastní události, events s argumenty jako u KeyDown, KeyUP a KeyPress pro controls a forms.

Třetí dotaz, zda nepoužít pro subclassing Nativewindow (AssignHandle, ReleaseHandle), jsou tam k dispozici další vymoženosti, ale způsobuje prý problém, když se použije vícekrát pro okno stejné třídy, nemáte s tím někdo zkušenost, cizí aplikace jsou z balíku MS Office, např. cílem pro Excel volat ContextMenuStrip místo výchozí kontextové nabídky, nahradit událost při dvojím kliknutí (případně odchytit také jedno kliknutí) a odchytávat klávesnici pro kontrolu edit módu buňky.

K této problematice se váže také možnost použít MouseHook a KeyboardHook, bohužel se mi nepovedlo vůbec zprovoznit. Subclassing pomocí SetWindowLong plus GWL_PROC a voláním CallWindowProc funguje pouze z knihovny injektované do procesu jako registrovaný COMAddInn, pokus o subclassing běžící instance mimo dll končí nezdarem.

Předem děkuji za případnou, třeba jen dílčí odpověď či odkaz s obdobným řešením pro VB.net (nebo i C#).

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback