zoukankan      html  css  js  c++  java
  • 26、Windows API Shell编程(2)

    二、文件协助(File Associations)

        File Associations可以指定Shell在显示、处理特定文件类型的文件时的方式,包括如下几个方面:

    ◇双击文件时,哪个应用程序应该被用来打开这个文件;

    ◇文件的图标;

    ◇在Explorer中浏览时显示的文件类型等;

    ◇文件的右键菜单中显示的指令(菜单项);

    ◇一些用户界面细节,比如当鼠标指针停留在图标上时所弹出的提示信(Infotip)

    File Associations相关的一个重要概念是“文件类型”,每一种文件类型对应特定的文件扩展名。为了使Shell (Explorer.exe)能够正确识别文件类型,需要在注册表中进行相关的注册。只有在注册表中正确注册了的文件类型Shell才知道如何选择文件的图标、如何指定双击文件时打开文件所需的应用程序。

    1、文件类型相关注册表键值

    1)文件类型

    具有同一种文件扩展名的文件属于同一个文件类型。如果需要Shell识别这种文件类型,需要在注册表中注册。注册一个文件类型包括两个方面,一是在HKEY_CLASSES_ROOT设置扩展名子键,并将默认值设置为文件扩展名对应的ProgID (Programmatic Identifiers,可编程标识符);二是在HKEY_CLASSES_ROOT键值下建立ProgID子键,并设置相关属性。

    2)扩展名键

    HKEY_CLASSES_ROOT的扩展名子键除了默认键值应为ProgID,还可以设置其他键值或子键。包括PerceivedTypeContent Type键值和penWithProgidsOpenWithList子键等。

    OpenWithListOpenWithProgids子键分别设置了“打开方式”列表和“打开方式”-“选择程序”对话框中可选的项。

    3)可编程标识符

    ProgID有多种子键:DefaultIconCurVershellshellex等,还具有多种键值InfoTipFriendlyTypeName等。

    ProgID的默认键值指定了文件类型的描述;InfoTip键值指定了用户将鼠标指针移动到该种类型的文件时,所弹出的提示信息。

    DefaultIcon子键指定了该种文件类型的默认图标。CurVer指明了当前版本。

    shell子键包括若干的命令处理程序(Handler),有一些默认Handleropenplay等)也可以注册自定义的Handler

    shellex中包括若干Shell扩展的Handler,用于新加右键菜单项、文件拖曳菜单、图标、属性对话框、提示对话框等,包括Context Menu handlerData handlerDrop handlerIcon handlerProperty sheet handlerInfotip handlerCopy hook handler等类型。

    2、为文件指定默认打开程序

    通过注册表可以为特定文件类型的文件指定默认打开的程序。指定默认打开程序后,在exploerer.exe中双击或选择“右键一打开”就可以打开文件。

    如下reg示例代码:

    .reg
    REGEDIT4

    [HKEY_CLASSES_ROOT\.win]
    @
    ="WINFile"
    [HKEY_CLASSES_ROOT\WINFile]
    @
    ="File Type Example"

    [HKEY_CLASSES_ROOT\WINFile\DefaultIcon]
    @
    ="shell32.dll,-152"
    [HKEY_CLASSES_ROOT\WINFile\shell\open\command]
    @
    = "NOTEPAD.EXE %1"
        通过以上方法。可以向Shell注册一个新的文件类型。但是直接修改注册表键值后,explorer.exe并不会立即关联到新的设置。所以需要注销重新登录,以重启explorer.exe

    SHChangeNotify函数可以使explorer.exe重新加载注册表设置,用户不用重新登录,新注册的文件类型就可以生效。使用如下参数调用SHChangeNotify

    SHChangeNotify
    #include <Windows.h>
    #include
    <shlobj.h>

    int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
    )
    {
    WinExec(
    "regedit win.reg", nCmdShow);
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
    }

    参考

    [1] 精通Windows API 函数、接口、编程实例

    [2] http://msdn.microsoft.com/en-us/library/bb773177%28VS.85%29.aspx

  • 相关阅读:
    Java中数组遍历
    数组常见异常
    数组的访问
    Java中数组的定义方式
    Java中数组的概念与特点
    node爬虫技术初探
    node相关内容
    vs code快捷键
    vue 入门开发
    es6 常见用法
  • 原文地址:https://www.cnblogs.com/mydomain/p/1958500.html
Copyright © 2011-2022 走看看