home *** CD-ROM | disk | FTP | other *** search
- Attribute VB_Name = "Shell_Functions"
- Option Explicit
-
- '----------------------------------------------------------
- ' Shell Extension Constants...
- '----------------------------------------------------------
- ' CHANGE HERE:
- ' HERE YOU CAN CHANGE THE
- ' * PROGRAM'S CLASS NAME
- ' * MENU TEXT
- '----------------------------------------------------------
- Private Const kPROGRAM_CLASS_NAME = "BitmapShellMenu.ShellExt"
- Public Const kMENU_ITEM_TEXT = "Set Wallpaper"
-
- Private Const KMENU_ITEM_IMAGE = 101&
-
- '----------------------------------------------------------
- ' Shell Extension Public Variable...
- '----------------------------------------------------------
- Public hBitmap(5) As Long
- Public pOldFunction As Long
-
-
- Sub Main()
- Dim ClassId As String
-
- LoadLibrary "oleaut32.dll"
- GetClassId kPROGRAM_CLASS_NAME, ClassId
- End Sub
-
- Public Function ReplaceVtableEntry(pObj As Long, _
- EntryNumber As Integer, _
- ByVal lpfn As Long) As Long
- Dim lOldAddr As Long
- Dim lpVtableHead As Long
- Dim lpfnAddr As Long
- Dim lOldProtect As Long
-
- CopyMemory lpVtableHead, ByVal pObj, 4
- lpfnAddr = lpVtableHead + (EntryNumber - 1) * 4
- CopyMemory lOldAddr, ByVal lpfnAddr, 4
-
- Call VirtualProtect(lpfnAddr, 4, PAGE_EXECUTE_READWRITE, lOldProtect)
- CopyMemory ByVal lpfnAddr, lpfn, 4
- Call VirtualProtect(lpfnAddr, 4, lOldProtect, lOldProtect)
-
- ReplaceVtableEntry = lOldAddr
- End Function
-
- Private Sub GetClassId(ByVal ProgID As String, ClassId As String)
- Dim rc As Long
- Dim IdLen As Integer
- Dim rClsId As uGUID
- Dim sProgId As String
- Dim bClassId() As Byte
-
- sProgId = StrConv(ProgID, vbUnicode)
- rc = CLSIDFromProgID(sProgId, rClsId)
-
- If (rc < 0) Then
- ClassId = "Bad ProgId rc::" & Str$(rc)
- Exit Sub
- End If
-
- IdLen = 40
- bClassId = String$(IdLen, 0)
- rc = StringFromGUID2(rClsId, VarPtr(bClassId(0)), IdLen)
-
- If (rc <= 0) Then
- ClassId = "Bad ClassID rc::" & Str$(rc)
- Exit Sub
- End If
- ClassId = bClassId
-
- If (Asc(Mid$(ClassId, rc, 1)) = 0) Then rc = rc - 1
- ClassId = Left$(ClassId, rc)
- End Sub
-
- Public Function sc_QueryContextMenu(ByVal This As IContextMenu, _
- ByVal hMenu As Long, _
- ByVal indexMenu As Long, _
- ByVal idCmdFirst As Long, _
- ByVal idCmdLast As Long, _
- ByVal uFlags As Long) As Long
- Dim SE As ShellExt
- Dim rc As Long
- Dim idCmd As Long
- Dim szMenu As String
- Dim szMenuText As String ' [64]
- Dim bAppendItems As Boolean
- Dim szTemp As String ' [32]
- Dim bBitmap() As Byte
- Dim mnuPict As Picture
-
- idCmd = idCmdFirst
- bAppendItems = True
-
- If ((uFlags And &HF&) = CMF_NORMAL) Then ' Check == here, since CMF_NORMAL=0
- szMenuText = " &" & kMENU_ITEM_TEXT
- ElseIf ((uFlags And CMF_VERBSONLY) = CMF_VERBSONLY) Then
- szMenuText = " &" & kMENU_ITEM_TEXT
- ElseIf ((uFlags And CMF_EXPLORE) = CMF_EXPLORE) Then
- szMenuText = " &" & kMENU_ITEM_TEXT
- ElseIf ((uFlags And CMF_DEFAULTONLY) = CMF_DEFAULTONLY) Then
- bAppendItems = False
- Else
- bAppendItems = False
- End If
-
- If bAppendItems Then
- '=======================================================================
- ' Insert 1st Menu...
- '=======================================================================
- Call InsertMenu(hMenu, indexMenu, MF_USECHECKBITMAPS Or MF_STRING Or MF_BYPOSITION, idCmd, szMenuText)
-
- ' Add checked bitmap...
- Set mnuPict = LoadResPicture(KMENU_ITEM_IMAGE, vbResBitmap)
- hBitmap(0) = ScaleBMP(mnuPict.Handle)
- Set mnuPict = Nothing
- Call SetMenuItemBitmaps(hMenu, indexMenu, MF_USECHECKBITMAPS Or MF_BITMAP Or MF_BYPOSITION, hBitmap(0), hBitmap(0))
-
- ' Increment Index and menu count...
- indexMenu = indexMenu + 1
- idCmd = idCmd + 1
-
-
- '=======================================================================
- ' Insert Menu Separator...
- '=======================================================================
- Call InsertMenu(hMenu, indexMenu, MF_SEPARATOR Or MF_BYPOSITION, 0, vbNullString)
- SEPEInsertMenu(hMenu, indexM SEPEInu(h,AppeCIertM mnuPictnoadResP ClassId = bClalcCp================vD,ApnlcCp======LD===S 1=================
- ' Insert Menu SMenu SMen= bCment InITIONn
- ,eByte
- t =============NI0, Or MF_B====
- ' Insert Menu SeparaA$m idCmd = idCmdg,=== Call InsertMenu(h_SEPARATOR Oring)
- SEPEInsertMenu(hMenu, indexM SEPEInu(h,Appesan = idCmdg,=== Call InsertMenu(h_SEPARATOR Oring)
- SEPEInsert==========SN(==============2_SEPARATOR O SEPAA$m idCmd = idCmdg,=== Call InsertMenu===EEEIn Call In iIn In Call la,d&e3 cu(hMIzkMENU_ITEM_TEXT = "Set Wallpaper"
-
- P Call la,d&e3 cu(hMIzkMENU_ITEM_T Dimll In mlt_FIn i2t2Set WalliC D(MENUut lENU_ITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSrITEeSr(hMNH,=== Call InsertMenu(h_SEPARATOR )eEeS0, vbNullS*ertMenu(h_SEeSrITEeSr Cal4yNUut t)0cCp================vD,ApnlcCp======LD===S 1=================
- n szThe0ertMenu(hMenu, indexMenu, MF_IertF_IertF_IertuMenu(hLMenu, MF_IertF'aT__u, indexMenu, MF_IertF_IertF_Iert2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2=======e rt2==irairairai 1==========Dst2==irairairai 1==E)
- '4 1==========Dst2==SrITEerHBrNceMUnu, MF_el
- sl4yNUut t)0cCpRE) Then
- EtMF_USECHECKBITMAPS OiPS OiPS OiPS OiPS OiEEI OiPS VENU_ITEM_______________lString)
- sertMenu(h_SEPARATOR Oring)
- SEalOiPS ORING S V=S 1ENU_ITEM_6EI Oh OiP,0uEM_6EI Oh OLOhRING S V=t=l4y OiPS VENU_ITEM_______________lString)
- sertMenu(h_SEPARATOR Oring)
- SEalOiPS ORING S V=S 1ENU_ITEM_6EI Oh OiP,0uEM_6EI Oh R Oring)
- ,)Val This As IContextMenu, _
- RdB=e rt2==irairaire rair1e)i BITMAPS EN=e rt2==ir "GoCaire n mnuPi rair1e
- u, _suenu(h_SEPAR
- yE0est As Long)S EN=e rt2==ir a oxMeOaire n mnuh_SEPAR
- E oxMeOaire npL mnuPi E oxMe- m)D2P,oxMe( 0E sc=B===
- M==D mnuPi oxMeOaib E=B===
- M===========
- nedlxMeOaib E=B=eOai
- M=eAeS)
- K2P,oxMe( 0i E=B===
- M===========
- nedlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlx