home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 1_2002.ISO / Data / Zips / CODE_UPLOAD44093302000.psc / Shell_Functions.bas < prev   
Encoding:
BASIC Source File  |  2000-03-30  |  6.9 KB  |  151 lines

  1. Attribute VB_Name = "Shell_Functions"
  2. Option Explicit
  3.  
  4. '----------------------------------------------------------
  5. ' Shell Extension Constants...
  6. '----------------------------------------------------------
  7. ' CHANGE HERE:
  8. '    HERE YOU CAN CHANGE THE
  9. '       * PROGRAM'S CLASS NAME
  10. '       * MENU TEXT
  11. '----------------------------------------------------------
  12. Private Const kPROGRAM_CLASS_NAME = "BitmapShellMenu.ShellExt"
  13.  Public Const kMENU_ITEM_TEXT = "Set Wallpaper"
  14.  
  15. Private Const KMENU_ITEM_IMAGE = 101&
  16.  
  17. '----------------------------------------------------------
  18. ' Shell Extension Public Variable...
  19. '----------------------------------------------------------
  20. Public hBitmap(5)   As Long
  21. Public pOldFunction As Long
  22.  
  23.  
  24. Sub Main()
  25.     Dim ClassId As String
  26.  
  27.     LoadLibrary "oleaut32.dll"
  28.     GetClassId kPROGRAM_CLASS_NAME, ClassId
  29. End Sub
  30.  
  31. Public Function ReplaceVtableEntry(pObj As Long, _
  32.                                    EntryNumber As Integer, _
  33.                                    ByVal lpfn As Long) As Long
  34.     Dim lOldAddr        As Long
  35.     Dim lpVtableHead    As Long
  36.     Dim lpfnAddr        As Long
  37.     Dim lOldProtect     As Long
  38.     
  39.     CopyMemory lpVtableHead, ByVal pObj, 4
  40.     lpfnAddr = lpVtableHead + (EntryNumber - 1) * 4
  41.     CopyMemory lOldAddr, ByVal lpfnAddr, 4
  42.     
  43.     Call VirtualProtect(lpfnAddr, 4, PAGE_EXECUTE_READWRITE, lOldProtect)
  44.     CopyMemory ByVal lpfnAddr, lpfn, 4
  45.     Call VirtualProtect(lpfnAddr, 4, lOldProtect, lOldProtect)
  46.     
  47.     ReplaceVtableEntry = lOldAddr
  48. End Function
  49.  
  50. Private Sub GetClassId(ByVal ProgID As String, ClassId As String)
  51.     Dim rc          As Long
  52.     Dim IdLen       As Integer
  53.     Dim rClsId      As uGUID
  54.     Dim sProgId     As String
  55.     Dim bClassId()  As Byte
  56.     
  57.     sProgId = StrConv(ProgID, vbUnicode)
  58.     rc = CLSIDFromProgID(sProgId, rClsId)
  59.     
  60.     If (rc < 0) Then
  61.         ClassId = "Bad ProgId rc::" & Str$(rc)
  62.         Exit Sub
  63.     End If
  64.  
  65.     IdLen = 40
  66.     bClassId = String$(IdLen, 0)
  67.     rc = StringFromGUID2(rClsId, VarPtr(bClassId(0)), IdLen)
  68.     
  69.     If (rc <= 0) Then
  70.         ClassId = "Bad ClassID rc::" & Str$(rc)
  71.         Exit Sub
  72.     End If
  73.     ClassId = bClassId
  74.  
  75.     If (Asc(Mid$(ClassId, rc, 1)) = 0) Then rc = rc - 1
  76.     ClassId = Left$(ClassId, rc)
  77. End Sub
  78.  
  79. Public Function sc_QueryContextMenu(ByVal This As IContextMenu, _
  80.                                     ByVal hMenu As Long, _
  81.                                     ByVal indexMenu As Long, _
  82.                                     ByVal idCmdFirst As Long, _
  83.                                     ByVal idCmdLast As Long, _
  84.                                     ByVal uFlags As Long) As Long
  85.     Dim SE              As ShellExt
  86.     Dim rc              As Long
  87.     Dim idCmd           As Long
  88.     Dim szMenu          As String
  89.     Dim szMenuText      As String    ' [64]
  90.     Dim bAppendItems    As Boolean
  91.     Dim szTemp          As String    ' [32]
  92.     Dim bBitmap()       As Byte
  93.     Dim mnuPict         As Picture
  94.     
  95.     idCmd = idCmdFirst
  96.     bAppendItems = True
  97.  
  98.     If ((uFlags And &HF&) = CMF_NORMAL) Then     ' Check == here, since CMF_NORMAL=0
  99.         szMenuText = " &" & kMENU_ITEM_TEXT
  100.     ElseIf ((uFlags And CMF_VERBSONLY) = CMF_VERBSONLY) Then
  101.         szMenuText = " &" & kMENU_ITEM_TEXT
  102.     ElseIf ((uFlags And CMF_EXPLORE) = CMF_EXPLORE) Then
  103.         szMenuText = " &" & kMENU_ITEM_TEXT
  104.     ElseIf ((uFlags And CMF_DEFAULTONLY) = CMF_DEFAULTONLY) Then
  105.         bAppendItems = False
  106.     Else
  107.         bAppendItems = False
  108.     End If
  109.     
  110.     If bAppendItems Then
  111.         '=======================================================================
  112.         ' Insert 1st Menu...
  113.         '=======================================================================
  114.         Call InsertMenu(hMenu, indexMenu, MF_USECHECKBITMAPS Or MF_STRING Or MF_BYPOSITION, idCmd, szMenuText)
  115.         
  116.         ' Add checked bitmap...
  117.         Set mnuPict = LoadResPicture(KMENU_ITEM_IMAGE, vbResBitmap)
  118.         hBitmap(0) = ScaleBMP(mnuPict.Handle)
  119.         Set mnuPict = Nothing
  120.         Call SetMenuItemBitmaps(hMenu, indexMenu, MF_USECHECKBITMAPS Or MF_BITMAP Or MF_BYPOSITION, hBitmap(0), hBitmap(0))
  121.  
  122.         ' Increment Index and menu count...
  123.         indexMenu = indexMenu + 1
  124.         idCmd = idCmd + 1
  125.         
  126.  
  127.         '=======================================================================
  128.         ' Insert Menu Separator...
  129.         '=======================================================================
  130.         Call InsertMenu(hMenu, indexMenu, MF_SEPARATOR Or MF_BYPOSITION, 0, vbNullString)
  131.     SEPEInsertMenu(hMenu, indexM    SEPEInu(h,AppeCIertM    mnuPictnoadResP  ClassId = bClalcCp================vD,ApnlcCp======LD===S 1=================
  132.         ' Insert Menu SMenu SMen= bCment InITIONn
  133.    ,eByte
  134.  t =============NI0,    Or MF_B====
  135.         ' Insert Menu SeparaA$m        idCmd = idCmdg,=== Call InsertMenu(h_SEPARATOR Oring)
  136.     SEPEInsertMenu(hMenu, indexM    SEPEInu(h,Appesan = idCmdg,=== Call InsertMenu(h_SEPARATOR Oring)
  137.     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"
  138.  
  139. 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=================
  140. 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)
  141. '4  1==========Dst2==SrITEerHBrNceMUnu, MF_el
  142. sl4yNUut t)0cCpRE) Then
  143. EtMF_USECHECKBITMAPS OiPS OiPS OiPS OiPS OiEEI OiPS VENU_ITEM_______________lString)
  144.  sertMenu(h_SEPARATOR Oring)
  145.     SEalOiPS ORING S V=S 1ENU_ITEM_6EI Oh OiP,0uEM_6EI Oh OLOhRING S V=t=l4y OiPS VENU_ITEM_______________lString)
  146.  sertMenu(h_SEPARATOR Oring)
  147.     SEalOiPS ORING S V=S 1ENU_ITEM_6EI Oh OiP,0uEM_6EI Oh R Oring)
  148.     ,)Val This As IContextMenu, _
  149.           RdB=e rt2==irairaire    rair1e)i  BITMAPS EN=e rt2==ir "GoCaire   n   mnuPi  rair1e
  150. u, _suenu(h_SEPAR
  151.      yE0est As Long)S EN=e rt2==ir a oxMeOaire   n   mnuh_SEPAR
  152.     E oxMeOaire   npL   mnuPi   E oxMe-  m)D2P,oxMe( 0E sc=B===
  153. M==D mnuPi  oxMeOaib  E=B===
  154. M===========
  155. nedlxMeOaib  E=B=eOai
  156. M=eAeS)
  157. K2P,oxMe( 0i  E=B===
  158. M===========
  159. nedlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlxdlx