VB.NET Adobe Reader jobb-klikk tiltása
2011-11-29T11:33:42+01:00
2011-12-06T16:22:45+01:00
2022-07-24T08:06:16+02:00
  • Kipróbáltam és az lett amit vártam. Semmi.

    TextBoxra szépen elő is hozza a contextmenut de az AdobeReaderre nem.

    Pedig az Adobenak van handle-ja.

    Szóval továbbra is csak erősödik bennem a gyanú, hogy az van amit visszább írtam.
    Mutasd a teljes hozzászólást!
  • Sajnos az Adobe Readernél a contextmenu nem úgy működik mint a legtöbb elemnél...


    Szerintem a WM_CONTEXTMENU egy rendszer üzenet, úgyhogy ezen csodálkoznék, ha nem lehetne elkapni. Az Adobe Handle-t el tudod érni? Mert ha igen, akkor még megpróbálnám a következő kódot(PostMessage()) egy button klikk-ben, vagy egy timerrel elindítani és megnézni, hogy előjön-e a contextmenu:

    Private Const WM_CONTEXTMENU As Integer = &H7B Public Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean ...... PostMessage(adobe.Handle, WM_CONTEXTMENU, IntPtr.Zero, IntPtr.Zero)
    Mutasd a teljes hozzászólást!
  • Így letiltja a jobb klikket?


    Ha ez alatt az általam picit módosított program kódot érted, akkor igen. Tiltja az egér jobb klikket és a jobb-klikk-billentyűt is. Csak mint írtam, jó pár próbából egyszer valamiért elszállt a billentyűgomb tiltó rész és csak az egér jobb klikket tiltotta.

    Ha az általad írt változtatásra gondolsz, akkor csak részben.
    Mert így mindenhol tiltja a jobb klikket a formon kivéve az Adobe Readernél.

    De ha nem csak a jobb klikket akarod letiltani, akkor miért nem a WM_CONTEXTMENU üzenetet kapod el az adobe ablakának a kezelőjében?

    Azért mert sajnos nem működik a dolog Adobe Reader esetében.

    Sajnos az Adobe Readernél a contextmenu nem úgy működik mint a legtöbb elemnél a contextmenu, az adobenál ez olyan, mintha írtak volna egy saját kis elemet ami jobb klikkre előjön (ami mondjuk eleve a contextmenu kinézetéből is látszik). Szóval mintha VB-ben a drawing meg egyéb hasonló funkciókkal oldanám meg a contextmenut. Szóval azt, hogy az Adobe Readernél jobb klikkre előjön valami, azt nem tudod sehogy sem észlelni. Azaz nekem ez a meglátásom.
    Mutasd a teljes hozzászólást!
  • hHook = SetWindowsHookEx(2, hookproc, GetModuleHandle(vbNullString), 0)
    hHook = SetWindowsHookEx(14, hookproc, GetModuleHandle(vbNullString), 0)


    Hát ez tényleg nem nagyon egészséges. Egyrészt azonos változóba(hHook) tenni a billentyű és egér hook-ot , másrészt mind a kettőt ugyanabban a "MouseHookProc"-ban kezelni.

    De ha nem csak a jobb klikket akarod letiltani, akkor miért nem a WM_CONTEXTMENU üzenetet kapod el az adobe ablakának a kezelőjében?

    Először szerintem próbáld meg lecserélni a 2011.12.03. 17:19-i hszemben ezt:

    hHook = SetWindowsHookEx(WH_MOUSE_LL, hookproc, GetModuleHandle(vbNullString), 0) erre: hHook = SetWindowsHookEx(WH_MOUSE, hookproc, IntPtr.Zero, GetCurrentThreadId())

    Persze ehhez a private részbe bele kell tenni ezt:

    Private Declare Function GetCurrentThreadId Lib "kernel32" Alias "GetCurrentThreadId" () As Integer

    Így letiltja a jobb klikket?
    Mutasd a teljes hozzászólást!
  • A modult a következőre módosítottam (és érdekes módon az Adobe Reader vs Keyboard Hook sem okozott most problémát.):

    Imports System.Runtime.InteropServices Module Hook Public Sub Egér_Hook_Indítása(ByVal ablak As Form) If hHook.Equals(0) Then frm = ablak hookproc = AddressOf MouseHookProc hHook = SetWindowsHookEx(2, hookproc, GetModuleHandle(vbNullString), 0) hHook = SetWindowsHookEx(14, hookproc, GetModuleHandle(vbNullString), 0) End If End Sub Public Sub Egér_Hook_Leállítása() If Not hHook.Equals(0) Then UnhookWindowsHookEx(hHook) hHook = 0 End If End Sub '********************* 'Private rész Private frm As Form Private Const WH_MOUSE As Integer = 7 Private Const WH_MOUSE_LL As Integer = 14 Private Const WM_LBUTTONDOWN As Integer = &H201 Private Const WM_LBUTTONUP As Integer = &H202& Private Const WM_RBUTTONDOWN As Integer = &H204 Private Const WM_RBUTTONUP As Integer = &H205 Private Const VK_RCB As Integer = &H5D Private Delegate Function MouseHookProcdelegate( _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer Private Structure POINTAPI Public x As Integer Public y As Integer End Structure Private Structure MOUSEHOOKSTRUCT Public pt As POINTAPI Public hwnd As Integer Public wHitTestCode As Integer Public dwExtraInfo As Integer End Structure Private Declare Function CallNextHookEx Lib "user32.dll" Alias "CallNextHookEx" ( _ ByVal idHook As Integer, _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer Private Declare Function GetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As IntPtr Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" ( _ ByVal idHook As Integer, _ ByVal HookProc As MouseHookProcdelegate, _ ByVal hInstance As IntPtr, _ ByVal wParam As Integer) As Integer Private Declare Function UnhookWindowsHookEx Lib "user32.dll" Alias "UnhookWindowsHookEx" (ByVal idHook As Integer) As Boolean Private hookproc As MouseHookProcdelegate, hHook As Integer = 0 Private Function MouseHookProc( _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer 'Dim eger As New MOUSEHOOKSTRUCT() If (nCode < 0) Then Return CallNextHookEx(hHook, nCode, wParam, lParam) 'eger = CType(Marshal.PtrToStructure(lParam, eger.GetType()), MOUSEHOOKSTRUCT) 'frm.Text = "Sor: " & eger.pt.y & " Oszlop: " & eger.pt.x 'If wParam = WM_LBUTTONDOWN Or wParam = WM_LBUTTONUP Or wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP Then Return -1 If wParam = VK_RCB Then Return -1 If wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP Then Return -1 Return CallNextHookEx(hHook, nCode, wParam, lParam) End Function End Module

    Így már tiltva van az a fránya jobb-klikk-billentyű-gomb is.
    Legalább 5-ször teszteltem, hogy bőszen nyomogatom itt a gombokat, viszont egyszer bebolondult és a billentyűzeten lévő jobb-klikk-billentyű-gombot nem akarta tiltani. De azóta sem tudom előidézni azt a hibát/kihagyást.
    Valakinek van valami ötlete, hogy miért lehetett?

    Bár gondolom nem teljesen egészséges ez sem így ahogy van, ha jól gondolom:
    Public Sub Egér_Hook_Indítása(ByVal ablak As Form) If hHook.Equals(0) Then frm = ablak hookproc = AddressOf MouseHookProc hHook = SetWindowsHookEx(2, hookproc, GetModuleHandle(vbNullString), 0) hHook = SetWindowsHookEx(14, hookproc, GetModuleHandle(vbNullString), 0) End If End Sub
    Mutasd a teljes hozzászólást!
  • Áááá.
    Sajnos meg is van az első hiányosság a programkódban.
    A billentyűzeten van egy olyan gomb, ami a jobb klikk helyettesítését végzi, és ez ellen a program nem véd sajnos. :(

    Gondolom ez esetben egy keyboard hook is kellene. :(
    Csak ezzel meg az a baj, ha van egy keyboard hook és egy adobe Reader megnyitott dokumentummal, akkor a program mindig össze fog omlani.
    Legalábbis nálam ez történik.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • De végiggondoltam, és nem is kell sehol az a jobb klikk.


    Ha meg mégis kell, akkor jobb klikk esetén meghatározod, hogy az egér az Adobe területén van-e, és ha igen, csak akkor tiltod, egyébként nem.

    Nem véletlenül tettem bele, hogy kiírja a pozíciót is.
    Mutasd a teljes hozzászólást!
  • LOL.
    Hát végül is mennyünk biztosra, ez is egy megoldás.
    Erre így nem gondoltam, hogy globálisan a teljes Windowsban tiltsuk a jobb klikket.
    De végiggondoltam, és nem is kell sehol az a jobb klikk.
    Szóval lényegében tökéletes megoldás esetemben.
    (Csak annyit módosítottam, hogy a bal klikk tiltását kivettem, mert úgy kicsit necces lenne bárminek is a kezelése/használata. )

    Aztán majd hétfő délelőtt melóhelyen kipróbálom, hogy működik a programomba implikálva. De tuti jó lesz.

    Ezer köszönet érte.
    Aztán nesze neked Adobe Reader!
    Mutasd a teljes hozzászólást!
  • Így már biztos letiltja.
    Egy kis adalék a használatához:
    váltás az ablakok között: Alt + Tab
    Ablak bezárása: Alt + F4
    De ezeket a billentyűkombinációkat mindenképp próbáld ki a használat előtt!!!

    Form1.vb: Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Hook.Egér_Hook_Indítása(Me) End Sub Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing Hook.Egér_Hook_Leállítása() End Sub End Class **************************** Hook.vb: Imports System.Runtime.InteropServices Module Hook Public Sub Egér_Hook_Indítása(ByVal ablak As Form) If hHook.Equals(0) Then frm = ablak hookproc = AddressOf MouseHookProc hHook = SetWindowsHookEx(WH_MOUSE_LL, hookproc, GetModuleHandle(vbNullString), 0) End If End Sub Public Sub Egér_Hook_Leállítása() If Not hHook.Equals(0) Then UnhookWindowsHookEx(hHook) hHook = 0 End If End Sub '********************* 'Private rész Private frm As Form Private Const WH_MOUSE As Integer = 7 Private Const WH_MOUSE_LL As Integer = 14 Private Const WM_LBUTTONDOWN As Integer = &H201 Private Const WM_LBUTTONUP As Integer = &H202& Private Const WM_RBUTTONDOWN As Integer = &H204 Private Const WM_RBUTTONUP As Integer = &H205 Private Delegate Function MouseHookProcdelegate( _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer Private Structure POINTAPI Public x As Integer Public y As Integer End Structure Private Structure MOUSEHOOKSTRUCT Public pt As POINTAPI Public hwnd As Integer Public wHitTestCode As Integer Public dwExtraInfo As Integer End Structure Private Declare Function CallNextHookEx Lib "user32.dll" Alias "CallNextHookEx" ( _ ByVal idHook As Integer, _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer Private Declare Function GetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As IntPtr Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" ( _ ByVal idHook As Integer, _ ByVal HookProc As MouseHookProcdelegate, _ ByVal hInstance As IntPtr, _ ByVal wParam As Integer) As Integer Private Declare Function UnhookWindowsHookEx Lib "user32.dll" Alias "UnhookWindowsHookEx" (ByVal idHook As Integer) As Boolean Private hookproc As MouseHookProcdelegate, hHook As Integer = 0 Private Function MouseHookProc( _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer Dim eger As New MOUSEHOOKSTRUCT() If (nCode < 0) Then Return CallNextHookEx(hHook, nCode, wParam, lParam) eger = CType(Marshal.PtrToStructure(lParam, eger.GetType()), MOUSEHOOKSTRUCT) frm.Text = "Sor: " & eger.pt.y & " Oszlop: " & eger.pt.x If wParam = WM_LBUTTONDOWN Or wParam = WM_LBUTTONUP Or wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP Then Return -1 Return CallNextHookEx(hHook, nCode, wParam, lParam) End Function End Module
    Mutasd a teljes hozzászólást!
  • Ha nem haragszol meg érte, ezt a kódot lementettem magamnak, hátha egyszer kell majd wmplayert használnom jobb klikk tiltással, mert akkor majd jól fog jönni, hogy ezt se kell megírnom.

    Viszont sajnos ez nem igen juttatott előrébb a megoldásban, mert az AdobeReader-el nem működik.

    Már kezdem azt hinni, hogy nem is lehet letiltani az adobe readernél a jobb klikket.
    Azt valami hihetetlen jól megírták.

    Mutasd a teljes hozzászólást!
  • Ugyan így volt alapból, kép mellékelve.
    Úgy csináltam ahogy írtad, és a hibaüzenet a következő:

    An error occurred creating the form. See Exception.InnerException for details. The error is: Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.


    Ez nálam az istenért sem akar elindulni.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Összedobtam egyet wmplayer jobb klikk engedélyezésére/tiltására, kipróbálható üzenetkezelővel és mouse hookkal is.
    A Formra csak egy button-t és egy AxWindowsMediaPlayer-t kell feltenni.

    Imports System.Runtime.InteropServices Public Class Form1 '****************************************************************************************************** 'Üzenetkezelő Private Const GWL_WNDPROC As Integer = -4 Private Const WM_RBUTTONDOWN As Integer = &H204 Private Const WM_RBUTTONUP As Integer = &H205 Private Delegate Function WindowProcDelegate( _ ByVal hwnd As Integer, _ ByVal msg As Integer, _ ByVal wParam As Integer, _ ByVal lParam As Integer) As Integer Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _ ByVal lpPrevWndFunc As Integer, _ ByVal hWnd As Integer, _ ByVal Msg As UInteger, _ ByVal wParam As Integer, _ ByVal lParam As Integer) As Integer Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _ ByVal hWnd As IntPtr, _ ByVal nIndex As Integer, _ ByVal dwNewLong As WindowProcDelegate) As Integer Private WinProc As WindowProcDelegate, wHook As Integer = 0, tiltva As Boolean = False Private Sub Windowprocindítás(ByVal hwnd As IntPtr) WinProc = AddressOf Windowproc wHook = SetWindowLong(hwnd, GWL_WNDPROC, WinProc) End Sub Private Function Windowproc( _ ByVal hwnd As Integer, _ ByVal msg As Integer, _ ByVal wParam As Integer, _ ByVal lParam As Integer) As Integer Select Case msg Case WM_RBUTTONDOWN, WM_RBUTTONUP If tiltva Then Return 0 End Select Return CallWindowProc(wHook, hwnd, msg, wParam, lParam) End Function '***************************************************************************************************** 'Mouse hook Private Const WH_MOUSE As Integer = 7 Private Delegate Function MouseHookProcdelegate( _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer <StructLayout(LayoutKind.Sequential)> Public Structure POINTAPI Public x As Integer Public y As Integer End Structure <StructLayout(LayoutKind.Sequential)> Public Structure MOUSEHOOKSTRUCT Public pt As POINTAPI Public hwnd As Integer Public wHitTestCode As Integer Public dwExtraInfo As Integer End Structure <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function CallNextHookEx( _ ByVal idHook As Integer, _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer End Function <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ Private Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr End Function <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function SetWindowsHookEx( _ ByVal idHook As Integer, _ ByVal HookProc As MouseHookProcdelegate, _ ByVal hInstance As IntPtr, _ ByVal wParam As Integer) As Integer End Function <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function UnhookWindowsHookEx(ByVal idHook As Integer) As Boolean End Function Private hookproc As MouseHookProcdelegate, hHook As Integer = 0 Private Sub Egér_Hook_Indítása() hookproc = AddressOf MouseHookProc hHook = SetWindowsHookEx( _ WH_MOUSE, _ hookproc, _ IntPtr.Zero, _ AppDomain.CurrentDomain.GetCurrentThreadId()) End Sub Private Sub Hook_Leállítása() UnhookWindowsHookEx(hHook) End Sub Private Function MouseHookProc( _ ByVal nCode As Integer, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Integer Dim MyMouseHookStruct As New MOUSEHOOKSTRUCT() Dim ret As Integer = 0 If (nCode < 0) Then Return CallNextHookEx(hHook, nCode, wParam, lParam) End If If wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP Then If tiltva Then Return -1 End If Return CallNextHookEx(hHook, nCode, wParam, lParam) End Function Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing If hHook <> 0 Then Hook_Leállítása() End Sub '***************************************************************************************************** 'példa az előző kettő valamelyikének kipróbálására 'a formra fel kell dobni egy buttont és egy axWindowsMediaPlayert Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Button1 .AutoSize = True .Location = New Point(10, 10) .Text = "Tiltás/Engedélyezés" End With With AxWindowsMediaPlayer1 .Location = New Point(10, Button1.Bottom + 10) .Size = New Size(300, 300) Me.Width = .Right + 20 Me.Height = .Bottom + 40 Me.Text = "Engedélyezve" End With 'Mouse hook próba esetén: 'Egér_Hook_Indítása() 'Üzenetkezelő próba esetén Windowprocindítás(AxWindowsMediaPlayer1.Handle) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click tiltva = Not tiltva If tiltva Then Me.Text = "Tiltva" Else Me.Text = "Engedélyezve" End Sub End Class
    Mutasd a teljes hozzászólást!
  • de, hogy indítom el egyben?

    A kép szerinti beállítással Solution build, s F5.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • De a helyzet a következő elágazással is ugyan az:
    If messg.Msg.ToString = 528


    Ezt jól benéztük

    A messg.Msg=528 WM_PARENTNOTIFY üzenet, vagyis a Te formod csak tájékoztatást kap, de nem a kizárólagos "tulajdonosa", így ha ezt letiltod, akkor az eredeti "tulajdonos" még más üzenetet megkap. Ezért volt az, hogy nálam egy sima formnál működött.

    Az egyik megoldás a Riha által javasolt mousehook, a másik pedig az, ha az üzenetkezelőnél nem a saját formodra iratkozol fel, hanem az adobe ablakára.

    Mondjuk én most csak mediaplayerrel tudnám ezt megcsinálni, de a lényeg egy olyan üzenetkezelő létrehozása, amely tetszőleges ablak kezelőjére iratkozik fel. Innentől kezdve már csak a megfelelő kezelőt kell neki átadni.
    Mutasd a teljes hozzászólást!
  • Lebuildoltam mind a kettőt külön külön, de, hogy indítom el egyben?
    Mert ha kiválasztom a 'Solution 'PDFView'... 'et akkor ott build lehetőség nincs, csak a "play" gomb, de arra az előzőleg említett hibaüzenet jön fel ismét.
    Mutasd a teljes hozzászólást!
  • Build-eld előbb a két project-et külön - külön ,
    (először a PDFView-t, majd a SamplePDFViewer-t)
    majd egyben, s csak azt követően indítsd.
    (én VS2008-al teszteltem)
    Mutasd a teljes hozzászólást!
  • Jaaa.
    Bocsi nem láttam.

    Viszont most már a következő a hibaüzenet:
    An error occurred creating the form. See Exception.InnerException for details. The error is: Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.


    Ennek mi köze van a mérethez?

    Ha egyszer lesz rá elegendő időm és kedvem, és tényleg érdekel, akkor leírom privátban részletesen hogy, hogyan működik itt a rendszer, de a lényeg, hogy a méret számít.

    Habár ennek ellenére, hogy e PDFviewert nem szeretném használni a programomba, mert nem felel meg a kritériumaimnak, attól még örülnék ha valahogy elindulna nálam, egy esetleges későbbi (projektben) még jól jöhet.. :)
    Mutasd a teljes hozzászólást!
  • Pont ugyan így néz ki nálam is.


    Nézd meg jobban.
    Mutasd a teljes hozzászólást!
  • Pont ugyan így néz ki nálam is.
    Csak esetemben WinXP van. :)
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Ennek mi köze van a mérethez?
    Röviden még egy kis információ morzsa: 76 wifis gép vs 5 wifi AP.


    Nem állítottam el semmit

    Állíts.
    Lásd. csatolt kép:
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Pedig hidd el van jogossága.
    Röviden még egy kis információ morzsa: 76 wifis gép vs 5 wifi AP.

    Dll-t indítom?
    Megnyitom a projectet (PDFView.sln) aztán klikk a "play" gombra és jön a hibaüzenet. Nem állítottam el semmit, ami miatt a DLL-t indítanám.
    De ugye eztán kreálódik egy exe is a debug mappába, amely viszont windows hibaüzenettel száll el, és hangsúlyoznám EXE, szóval nem dll-t indítok.

    Így hát nem értem mi lehet a probléma.
    Letöltöttem újból a programot az oldalról, hátha csak véletlen átírtam benne valamit, de ugyan az az eredmény.
    Mutasd a teljes hozzászólást!
  • mert írhatnék egy kisebb regényt

    Szívesen elolvasnám, mert kétlem a jogosságát..

    hogy nálam miért nem működik, a következő hibaüzenetet dobja:

    Mert a DLL-t indítod nem az azt használó project-et.
    Mutasd a teljes hozzászólást!
  • Nálam pedig így nem dob hibát.
    Melyik formra tettem? Csak 1 formmom van.
    Na de akkor részletekben a dolog, hátha így kitudod deríteni mit ronthattam el.

    Elindítom a "Microsoft Visual Basic 2010 Express" nevű programot.
    Majd "New Project...".
    Majd "Windows Forms Application"
    Utána jobb klikk bal oldalt az eszközöknél és "Choose Items..."
    Utána kikeresem az "Adobe PDF Reader"-t, és bepipálom, majd OK.
    Aztán ezt az Adobe PDF Readert ráhúzom a formra, majd törlöm vagy kis méretre állítom, ez itt mindegy, mind2 esetben ugyan az az eredmény.

    Utána a form.vb-be ezt írom:

    Public Class Form1 Public at As adober Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim adobe As New adober adobe.Size = New System.Drawing.Size(900, 650) Me.Controls.Add(adobe) at = adobe at.src = "C:\test.pdf" End Sub End Class Public Class adober Inherits AxAcroPDFLib.AxAcroPDF Protected Overrides Sub WndProc(ByRef messg As System.Windows.Forms.Message) 'egy irtó nagy üresség End Sub End Class

    Próbáltam a "Public Class adober" részt egy Class (elem, vagy modul, vagy nem tudom mi a neve)-be rakni, de ugyan azt a helyzet.

    Ha a "Protected Overrides Sub WndProc...." részt kiegészítem ezzel:
    If messg.WParam.ToString = 516 Or messg.WParam.ToString = 517 Or messg.WParam.ToString = 518 Then MsgBox("Jobb klikk!") Else MyBase.WndProc(messg) End If
    akkor ha az Adobe Reader területén nyomok egy jobb klikket, feljön a kis Messageboxom, szóval maga az Overrides esemény működik, mert eljut odáig minden infó ami kell, csak innen nem lehet semmissé tenni az eseményt, azaz a kattintást.

    De a helyzet a következő elágazással is ugyan az:
    If messg.Msg.ToString = 528 Or messg.Msg.ToString = 33 Then MsgBox("Bal klikk!") Else MyBase.WndProc(messg) End If

    Mind két esetben hiába kommentezem ki az MsgBox-ot, akkor is előjön jobb klikkre az adobe reader Context Menüje, szóval nem a messagebox zavar be, mint ahogy azt már írták.

    Már csak azért sem, mert mint ugye azt is írtam, ha eleve a "MyBase.WndProc(messg)" részt kiszedem akkor is eljut minden kis esemény az Adobe Reader-hez.

    Most így akkor összefoglaltam szerintem mindent. :)
    Mutasd a teljes hozzászólást!
  • Nálam működik, ha megfelelő számokat adom meg.

    Viszont amit itt írtál:
    Zserigta válasza Árnyék (15:40) hozzászólására előzmény | privát | 2011.11.29. 15:48 | válasz


    Okés, de mint írtam, akármit nézhetek, ha a következő a forráskód, akkor is átmegy minden kattintás, pedig az elmondásod szerint, ha jól értelmezem, így semmilyen kattintásnak nem kellene átmennie:
    Protected Overrides Sub WndProc(ByRef messg As System.Windows.Forms.Message)
    'egy irtó nagy üresség
    End Sub


    Ez nálam akkora hibát dob, hogy öröm nézni. Nem is csoda, hiszen a form ebben az esetben nem is kap üzenetet. Úgyhogy ha Nálad ez hibátlanul lefut, akkor lehet, hogy nem a megfelelő formra tetted, vagy nem tudom, de hogy valami nincs rendben az biztos...
    Mutasd a teljes hozzászólást!
  • Hát most ebbe nem mennék nagyon bele, mert írhatnék egy kisebb regényt, lényeg, hogy nagyon számít a méret. Az Adobe meg minden gépen megtalálható, amelyen az általam írt programot használnák.

    Egyébként nem tudom, hogy nálam miért nem működik, a következő hibaüzenetet dobja:
    A project with an Output Type of Class Library cannot be started directly.

    In order to debug this project, add an executable project to this solution wich references the library project.
    Set the executable project as the startup project.
    Mutasd a teljes hozzászólást!
  • Ez sajnos nem igazán tetszik, mivel nagyon nagy a forráskód és még csak nem is fut le.

    Nekem lefutott (lásd. csatolt kép).
    Nem tudom/értem mi lehet a gondod a forrás méretével.
    Elárulnád?
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Külön leírom neked is.

    Üres formon tökéletesen működik ez a HOOK-os dolog.
    De amint a formra ráhelyezel egy Adobe Reader-t akkor elkezd szaggatni az egér kb 3-4 mp-ig aztán feljön a hibaüzenet, amit már legalább 3-szor bemásoltam.
    Az időközbe mikor az egér elkezd szaggatni a processzor terhelés, csak 10-15 %-on van, szóval nem tudom miért csinálhat ilyet.

    2 gépen is próbáltam, mind2-őn ugyan ez az eredmény.

    Ezért kérnélek téged is, hogy próbáld ki úgy a programkódodat, hogy a formon legyen Adobe Reader, és nézd meg, hogy úgy mit csinál.

    Lehet csak nálam van gebasz, mondjuk más fajta Adobe Reader-em van, vagy nem tudom, de nálam nem működik egyikőtök válaszában írt programkód sem úgy ahogy kellene.

    Köszönöm türelmed/türelmetek és megértésed/megértésetek.
    Mutasd a teljes hozzászólást!
  • De te ki is próbáltad? Nálad működik a dolog a te általad elgondolt más számokkal?
    Mert azt nagyon kétlem.

    Elmondásotok szerint a "MyBase.WndProc(messg)" parancs engedi tovább az eseményt, szóval ezek szerint ha ezt a sort kikommentezem, akkor semmilyen események (pl kattintásnak) nem kéne továbbmennie az Adobe Reader felé, de mégis tovább megy.
    Szóval ezek szerint csak nem jó egyikféle megoldás sem.

    Esetleg a hook-os, de attól meg mindegyik verziónál elkezd szaggatni az egér, majd jön a hibaüzenet, hogy ha a formon megtalálható az Adobe Reader.

    Elég ******* ez az Adobe Reader.

    Szóval attól még hogy a megoldásotok, minden más komponens/object-el működik, attól még nem feltétlen igaz ez az Adobe Reader-re, sőt nagyon nem, mert arra egyik sem volt megoldás.

    Bármilyen más komponensnél tudom tiltani a jobb klikket VB6-ban és VB.net alatt is, egyedül Adobe Readernél nem működik, és ezért is kértem a segítséget, mert ez számomra elég lehetetlennek tűnő feladat.

    Ezért is kértem, hogy valamelyikőtök aki penge VB.net-ből az próbálja légyszi megcsinálni otthon a gépén ezt a kis programot, és ha MŰKÖDIK neki Adobe Reader-el a jobb klikk tiltása, akkor másolja be ide az általa írt kódot.

    Köszönöm a megértésetek.
    Mutasd a teljes hozzászólást!
  • Árnyék már megadta a kérdésedre a választ. Tehát a 2. példád a jó, csak megfelelő értékeket kell használod az 528 és a 33 helyett.
    Mutasd a teljes hozzászólást!
  • Nekem működik.
    How to set a hook in Visual Basic .NET
    Nem tudod elrontani, csupán másolni kell a kódot, s majd jöhet az F5.
    Én VS 2010 prof.-al kreáltam, egy sornál brummogott.

    Igy néz ki javítva:
    If hHook.Equals(0) Then hookproc = AddressOf MouseHookProc hHook = SetWindowsHookEx(WH_MOUSE, _ hookproc, _ IntPtr.Zero, _ AppDomain.GetCurrentThreadId())
    Mutasd a teljes hozzászólást!
    Csatolt állomány
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd