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#).
|