转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
Windows外壳扩展编程之添加右键菜单         ★★★★

Windows外壳扩展编程之添加右键菜单

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2576 更新时间:2009/4/23 18:26:02
;  if Register then begin
      inherited UpdateRegistry(Register);
      ClassID := GUIDToString(Class_ContextMenu);
      CreateRegKey(''''*\shellex'''', '''''''', '''''''');
      CreateRegKey(''''*\shellex\ContextMenuHandlers'''', '''''''', '''''''');
      CreateRegKey(''''*\shellex\ContextMenuHandlers\OpenWithWordPad'''', '''''''', ClassID);

    file://如果操作系统为Windows NT的话
      if (Win32Platform = VER_PLATFORM_WIN32_NT) then
      with TRegistry.Create do
      try
         RootKey := HKEY_LOCAL_MACHINE;
         OpenKey(''''SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions'''', True);
         OpenKey(''''Approved'''', True);
         WriteString(ClassID, ''''Context Menu Shell Extension'''');
      finally
         Free;
      end;
   end
   else begin
      DeleteRegKey(''''*\shellex\ContextMenuHandlers\FileOpreation'''');
      DeleteRegKey(''''*\shellex\ContextMenuHandlers'''');
//      DeleteRegKey(''''*\shellex'''');
      inherited UpdateRegistry(Register);
   end;
end;

 

initialization
 TContextMenuFactory.Create(ComServer, TContextMenu, Class_ContextMenu,
   '''''''', ''''Context Menu Shell Extension'''', ciMultiInstance,tmApartment);

end.

    将该单位文件保存为unit2.pas,文件同contextmenu.dpr位于同一个目录下。
    打开Delphi,选菜单中的 file | open project 打开contextmenu.dpr文件,然后选 Project | build contextmenu菜单项编译连接程序,如果编译成功的话,会建立一个contextmenu.dll的动态连接库文件,这个文件就是服务器动态连接库。

    下面来建立文件操作程序。打开VB,建立一个新的工程文件,在Form1中加入一个ListBox控件和三个CommandButton控件,将ListBox的MultiSelect属性设置为2。然后在Form1的代码窗口中加入以下代码:
Option Explicit

Private Type BrowseInfo
     hwndOwner As Long
     pIDLRoot As Long
     pszDisplayName As Long
     lpszTitle As Long
     ulFlags As Long
     lpfnCallback As Long
     lParam As Long
     iImage As Long
End Type
Private Type SHFILEOPSTRUCT
    hwnd As Long
    wFunc As Long       ''''对文件的操作指令
    pFrom As String     ''''源文件或路径
    pTo As String       ''''目的文件或路径
    fFlags As Integer   ''''操作标志
    fAnyOperationsAborted As Long
    hNameMappings As Long
    lpszProgressTitle As String
End Type

Const FO_COPY = &H2
Const FO_DELETE = &H3
Const FO_MOVE = &H1
Const FO_RENAME = &H4
Const FOF_ALLOWUNDO = &H40
Const BIF_RETURNONLYFSDIRS = 1
Const MAX_PATH = 260

Private Declare Function ShellAbout Lib "shell32.dll" Alias _
        "ShellAboutA" (ByVal hwnd As Long, ByVal szApp As _
        String, ByVal szOtherStuff As String, ByVal hIcon As Long) _
        As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias _
        "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 _
        As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi _
        As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" _
        (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function SHFileOperation Lib "shell32" _
        (lpFileOp As SHFILEOPSTRUCT) As Long
Private Declare Function GetWindowsDirectory _
        Lib "kernel32" Alias "GetWindowsDirectoryA" _
        (ByVal lpBuffer As String, ByVal nSize As _
        Long) As Long

Dim DirString As String
Dim sFile As String

Sub UpdateList()
    ''''UpdateList函数检查列表框中的文件是否存在,如果不存在,就将其
    ''''从文件列表中删除
    Dim bEndList As Boolean
    Dim i As Integer
   
    bEndList = True
    i = 0
    While bEndList
        ''''检查文件是否存在,如果不存在就删除
        If Dir$(List1.List(i)) = "" Then
            List1.RemoveItem (i)
        Else    ''''如果文件存在就转移到下一个列表项
            i = i + 1
            If i > List1.ListCount - 1 Then
                bEndList = False
            End If
        End If
    Wend
    Command1.Enabled = False
    Command2.Enabled = False
    Command3.Enabled = False
End Sub

Function BrowseForFolder(hwndOwner As Long, sPrompt As String) As String
     Dim iNull As Integer
     Dim lpIDList As Long
     Dim lResult As Long
     Dim sPath As String
     Dim udtBI As BrowseInfo

    ''''初试化udtBI结构
     With udtBI
        .hwndOwner = hwndOwner
        .lpszTitle = lstrcat(sPrompt, "")
        .ulFlags = BIF_RETURNONLYFSDIRS
     End With
   
    ''''弹出文件夹查看窗口
     lpIDList = SHBrowseForFolder(udtBI)
    
     If lpIDList Then
        sPath = String$(MAX_PATH, 0)
        lResult = SHGetPathFromIDList(lpIDList, sPath)
        Call CoTaskMemFree(lpIDList)
        iNull = InStr(sPath, vbNullChar)
        If iNull Then sPath = Left$(sPath, iNull - 1)
     End If

     BrowseForFolder = sPath
End Function

Private Sub Command1_Click()    ''''执行文件拷贝操作
    Dim sPath As String
    Dim tCopy As SHFILEOPSTRUCT
    Dim i As Integer
   
    ''''选择拷贝到的文件夹
    sPath = BrowseForFolder(Form1.hwnd, "选择拷贝到的文件夹")
    If sPath <> "" Then
        With tCopy
            .hwnd = Form1.hwnd
            .lpszProgressTitle = "正在拷贝"
            .pTo = sPath
            .fFlags = FOF_ALLOWUNDO
            .wFunc = FO_COPY
        End With
        For i = 0 To List1.ListCount - 1
            If List1.Selected(i) Then   ''''如果文件被选中则拷贝文件
                tCopy.pFrom = List1.List(i)
                SHFileOperation tCopy
            End If
        Next i
        UpdateList
    End If
    Kill sFile
End Sub

Private Sub Command2_Click()    ''''执行文件移动操作
    Dim sPath As String
    Dim tCopy As SHFILEOPSTRUCT
    Dim i As Integer
   
    ''''选择移动到的文件夹
    sPath = BrowseForFolder(Form1.hwnd, "选择转移到的文件夹")
    If sPath <> "" Then
        With tCopy
            .hwnd = Form1.hwnd
            .lpszProgressTitle = "正在移动"
            .pTo = sPath
            .fFlags = FOF_ALLOWUNDO
    &n

上一页  [1] [2] [3]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台