[译]使用TweakJS在通用对话框中自定义我的位置栏
By robot-v1.0
本文链接 https://www.kyfws.com/applications/customize-the-my-places-bar-in-common-dialogs-with-zh/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 17 分钟阅读 - 8048 个词 阅读量 0[译]使用TweakJS在通用对话框中自定义我的位置栏
原文地址:https://www.codeproject.com/Articles/12531/Customize-the-My-Places-Bar-in-Common-Dialogs-with
原文作者:Jason Sundram
译文由本站 robot-v1.0 翻译
前言
Customize Open/Save dialogs in Win 2K/XP and MS Office.
在Win 2K/XP和MS Office中自定义"打开/保存"对话框.
内容(Contents)
介绍(Introduction)
作为他们的一部分(As part of their) Windows电动玩具(Power Toys for Windows) ,Microsoft提供了一个很酷的工具,称为TweakUI.该工具允许您(不起眼的Windows XP用户)更改XP的某些默认设置,而无需直接修改注册表.通过将许多有用的设置放在您的指尖,而不是深入嵌套在注册表肠中,您可以摆脱经常伴随注册表修改的恐惧和颤抖.(, Microsoft offers a cool tool called TweakUI. This tool allows you, the humble Windows XP user, to change some of XPs default settings without modifying the registry directly. This frees you from the fear and tremble that often accompanies registry modification by placing a lot of useful settings at your fingertips, rather than deeply nested in the registry bowels.)
我发现特别有用的一项调整是(One of the tweaks that I’ve found particularly useful is the)**位置栏(Places Bar)**TweakUI中的页面.此页面提供了设置显示在以下目录中的文件夹的功能(page in TweakUI. This page provides the ability to set the folders that are shown in)我的位置栏(My Places Bar),在整个Windows的许多打开/保存对话框中显示的栏.自定义此栏可让我进入最常保存文件的文件夹,每次保存文件时都单击几下.(, the bar that is displayed in many open/save dialogs throughout Windows. Customizing this bar lets me get to the folders I save files in most often, saving a few clicks every time I save a file.)
但是,Microsoft Office使用其自己的"打开/保存"对话框,而不关注TweakUI的修改.(However, Microsoft Office uses its own Open/Save dialogs, and doesn’t pay attention to TweakUI’s modifications.)
输入TweakJS. TweakJS与TweakUI中的"位置栏"页面相似,但有两个重要区别:(Enter TweakJS. TweakJS is similar to the Places Bar page in TweakUI, but with two significant differences:)
- 它自定义(It customizes)*我的位置栏(My Places Bar)*适用于Microsoft Office和常见对话框.(for both Microsoft Office and the common dialogs.)
- 它允许为所选文件夹创建一组快捷方式.(It allows the creation of a set of shortcuts to the folders chosen.)
免责声明(Disclaimer)
尽管我已尽一切努力使此代码安全正确地运行,但是当您运行任何修改注册表的软件时,总会有风险.就像Mozilla网站上的异想天开的免责声明一样,我们无法保证TweakJS不会炸毁处理器,侮辱母亲或使您爆发讨厌的皮疹.尽管我将尽力解决所报告的任何问题,但对于此软件可能引起的这些或任何其他问题,我不承担任何责任.如果这吓到您,您可能不应该运行TweakJS.(Although I have made every effort to make this code run safely and correctly, there is always a risk when you run any software that modifies the registry. Like the whimsical disclaimer featured on Mozilla’s website, there is no guarantee that TweakJS won’t fry your processor, insult your mother, or cause you to break out in a nasty rash. I take no responsibility for these or any other problems that this software may cause, though I will do my best to fix any problems reported. If this scares you, you probably shouldn’t run TweakJS.)
由于注册表修改,您很可能需要管理员访问权限才能利用TweakJS.(You will most likely need administrator access to take advantage of TweakJS, due to the registry modifications.)
用法(Usage)
TweakJS允许您选择最多五个文件夹,这些文件夹将显示在(TweakJS allows you to select up to five folders that will appear in the)我的位置栏(My Places Bar).在TweakJS中选择文件夹后,它们将出现在显示以下内容的任何"打开/保存"对话框中(. Once the folders have been selected in TweakJS, they will appear in any Open/Save dialog that shows)我的位置栏(My Places Bar).(.)
的(The)**链接(Links)**选项会为您选择添加到文件夹中的文件夹创建快捷方式(option creates shortcuts to the folders you’ve selected to add to the)我的位置栏(My Places Bar).你为什么要这样做?我这样做是因为它允许我创建一个可以放置在任务栏上的工具栏,从而可以轻松访问我选择的目录(请参见下面的屏幕截图):(. Why would you do such a thing? I do it because it allows me to create a toolbar that can be placed on the taskbar, allowing easy access to the directories I’ve chosen (see the screenshot below):)
请注意,在屏幕截图中,第一个链接的标题为(Note that in the screenshot, the first link is titled)自定义链接(Customize Links).该链接是自动添加的.它指向所有快捷方式都存储在其中的文件夹,从而可以轻松地访问该文件夹并在需要时添加更多快捷方式.(. This link is added automatically. It points to the folder all the shortcuts are stored in, making it easy to get to that folder and add more shortcuts as and when necessary.)
使此工具栏可见:(To make this toolbar visible:)
- 右键单击任务栏.(Right-click on the taskbar.)
- 选择工具栏|新工具栏.(Select Toolbars | New Toolbar.)
- 浏览在TweakS中选择的输出文件夹.(Browse for the output folder you chose in TweakJS.)
- 您可能需要通过向上滑动系统托盘旁边的工具栏来调整其大小.(You will probably need to size the toolbar by sliding it up next to the system tray.)
- 在能够移动/调整新工具栏的大小之前,可能需要解锁工具栏(右键单击,取消选中"锁定任务栏").(It may be necessary to unlock the toolbar (right-click, uncheck Lock the Taskbar) before you are able to move/size your new toolbar.)
背景(Background)
为了配置Microsoft Office中的常见对话框,我查阅了Microsoft的知识库.(In order to configure the common dialogs within Microsoft Office, I consulted Microsoft’s knowledge base.) 第20501条(Article 20501) 记录注册表更改,这些更改对于自定义(documents the registry changes that are necessary to customize the)我的位置栏(My Places Bar)在MS Office 2000的"打开/保存"对话框中.注册表设置位于以下项中:(in MS Office 2000’s Open/Save dialogs. The registry settings are found in the key:)HKCU \ Software \ Microsoft \ Office \ 9.0 \ Common \ OpenFind \ Places(HKCU\Software\Microsoft\Office\9.0\Common\OpenFind\Places).(.)
数字9.0使这些设置特定于Office 2000.对于Office XP,该数字为10.0,对于Office 2003,该数字为11.0.我无权访问Office XP或2003,因此无法使用这些程序测试此代码.(The number 9.0 makes these settings Office 2000-specific. The number is 10.0 for Office XP, and 11.0 for Office 2003. I don’t have access to Office XP or 2003, so I was unable to test this code with those programs.)
TweakUI修改的设置以其他格式存储,位于以下位置:(The settings that are modified by TweakUI are stored in a different format, and are located here:)HKCU \软件\ Microsoft \ Windows \ CurrentVersion \ Policies \ comdlg32 \ PlacesBar(HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\comdlg32\PlacesBar).这些设置显然可以手动修改,但是使用TweakJS更加简单快捷.(. These settings can obviously be modified manually, but using TweakJS is much simpler and faster.)
编写此代码后,我发现两个应用程序也可以自定义"我的位置栏",一个用于普通的Windows对话框,另一个用于Microsoft Office对话框.程序位于(After writing this code, I found two applications that also allow customizing the My Places Bar, one for the common Windows dialogs, and another for Microsoft Office dialogs. The programs are located) 这里(here) .我没有用过,所以我不能担保它们.这些程序提供了能够保存和重新调用目录列表的附加功能,如果您需要访问不同的目录集(取决于您正在处理的项目,甚至是正在执行的工作类型),这可能会非常有用. .如果对此功能有足够的需求,我将考虑在TweakJS中实现它.我仍然觉得TweakJS是一个有价值的程序,因为它允许用户同时自定义MS Office和Windows的通用对话框.(. I haven’t used them, so I can’t vouch for them. These programs offer the additional feature of being able to save and recall lists of directories, which may be very useful if you need access to different sets of directories depending on which project you’re working on, or even what type of work you are doing. If there is enough demand for such a feature, I will consider implementing it in TweakJS. I still feel that TweakJS is a worthwhile program, as it allows the user to customize both MS Office’s and Windows' common dialogs at once.)
清除(Removal)
第一次运行TweakJS时,它将备份Windows和MS Office中的当前"通用对话框"设置.将被修改的注册表项被导出到两个文件,(The first time TweakJS runs, it backs up the current Common Dialog settings in Windows and MS Office. The registry keys that will be modified are exported to two files,)*办公室(Office.reg)*用于MS Office设置,以及(for MS Office settings, and)*Windows.reg(Windows.reg)*Windows设置.运行以下命令来创建这些文件(第二个命令根据检测到的Office版本或是否检测到Office而有所不同):(for Windows settings. The following commands are run to create these files (the second command varies depending on the version of Office detected, or if Office is detected at all):)
[编辑注释:换行符用于避免滚动.]([Editor comment: Line breaks used to avoid scrolling.])
Regedit /e Windows.reg HKCU\Software\Microsoft\
Windows\CurrentVersion\Policies\comdlg32\PlacesBar
Regedit /e Office.reg "HKCU\Software\Microsoft\Office\9.0\
Common\OpenFind
当…的时候(When the)**去掉(Remove)**按下按钮,TweakJS创建一个注册表脚本((button is pressed, TweakJS creates a registry script ()删除(remove.reg))删除由TweakJS修改的所有注册表项:() to delete all the registry keys that were modified by TweakJS:)
[编辑注释:换行符用于避免滚动.]([Editor comment: Line breaks used to avoid scrolling.])
[-HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\
Common\Open Find\Places]
[-HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\Policies\comdlg32]
[-HKEY_CURRENT_USER\Software\TweakJS]
它首先运行它创建的脚本,删除TweakJS所做的所有更改,然后合并TweakJS首次运行时创建的两个备份文件.如果您想删除可执行文件,它还会打开运行TweakJS的目录.(It first runs the script it created, removing all the changes TweakJS has made, and then merges the two backup files TweakJS created the first time it ran. It also opens the directory TweakJS is running from, in case you want to delete the executable.)
代码概述(Overview of the code)
TweakJS是一个相当简单的程序,包括:(TweakJS is a fairly simple program, consisting of:)
- 用户界面代码.(User interface code.)
- 用于读取和写入注册表的代码.(Code to read from and write to the registry.)
- 用于检测MS Office安装版本的代码.(Code to detect the installed version of MS Office.)
- 代码写出快捷方式文件.(Code to write shortcut files out.)
用户界面代码(User interface code)
TweakJS中的组合框模拟了它们的TweakUI副本.班级(The combo boxes in TweakJS emulate their TweakUI counterparts. The class) CBrowseCombo
封装了它们的功能.(encapsulates their functionality.) CBrowseCombo
是一个组合框,允许用户浏览要添加到组合框的文件夹.顾名思义,它源自(is a combobox that allows the user to browse for a folder to be added to the combobox. As its name suggests, it is derived from) CComboBox
.制造(. Making) CBrowseCombo
派生类保存对话框类,(a derived class saves the dialog class,) CTweakJSDlg
,而不必处理初始化或处理其浏览行为.由于其中有五个,因此它也消除了一堆冗余代码.(, from having to deal with initializing it or handling its browse behavior. Since there are five of them, it also eliminates a bunch of redundant code.)
一种(A) CBrowseCombo
框在行动.(box in action.)
组合框中的每个默认位置都通过获取其显示名称来命名(Each of the default locations in the combo box is named by getting the display name for its) CSIDL(CSIDL) 从外壳:(from the shell:)
bool CBrowseCombo::GetDisplayName(UINT csidl,
CString& sDisplayName)
{
// A pointer to the shell's IMalloc interface
IMalloc * pShellMalloc = NULL;
// A pointer to the parent folder object's
// IShellFolder interface.
IShellFolder *psfParent;
// The item's PIDL.
LPITEMIDLIST pidlItem = NULL;
// The item's PIDL relative to the parent folder.
LPITEMIDLIST pidlRelative = NULL;
// The structure for strings returned from
// IShellFolder.
STRRET str;
// The display name of this folder
TCHAR szDisplayName[MAX_PATH]= _T("");
HRESULT hr = SHGetMalloc(&pShellMalloc);
bool bReturn = false;
if (SUCCEEDED(hr))
{
hr = SHGetSpecialFolderLocation(NULL,
csidl, &pidlItem);
if (SUCCEEDED(hr))
{
hr = SHBindToParent(pidlItem,
IID_IShellFolder, (void**)&psfParent,
(LPCITEMIDLIST*)&pidlRelative);
if (SUCCEEDED(hr))
{
// Retrieve the display name
memset(&str, 0, sizeof(str));
hr = psfParent->GetDisplayNameOf(
pidlRelative, SHGDN_NORMAL, &str);
if (SUCCEEDED(hr))
{
StrRetToBuf(&str, pidlItem,
szDisplayName, MAX_PATH);
sDisplayName = szDisplayName;
bReturn = true;
}
psfParent->Release();
}
}
// Clean up allocated memory
if (pidlItem)
pShellMalloc->Free(pidlItem);
pShellMalloc->Release();
}
return bReturn;
}
每个默认位置的商品数据显示在(The item data for each of the default locations shown in) CBrowseCombo
设置为其CSIDL. “路径”(如果存在),“浏览"和其他三个附加项目的项目数据值分别为-1,-2和-3.这使对话框可以专门处理这些情况.(is set to its CSIDL. The three extra items, Path (if present), Browse, and the other, have item data values of -1, -2, and -3, respectively. This allows the dialog to handle these cases specially.)
浏览文件夹时使用的shell对话框代码可能现在到处都存在:(Browsing for a folder uses the shell dialog code that’s probably present everywhere by now:)
bool CUtility::Browse(HWND hOwner, CString &sFolder)
{
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = hOwner;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
bool bRet = false;
TCHAR szFolder[MAX_PATH*2];
szFolder[0] = _T('\0');
if (pidl)
{
if (SHGetPathFromIDList(pidl, szFolder))
{
bRet = true;
sFolder = szFolder;
}
IMalloc *pMalloc = NULL;
if (SUCCEEDED(SHGetMalloc(&pMalloc)) && pMalloc)
{
pMalloc->Free(pidl);
pMalloc->Release();
}
}
return bRet;
}
注册表代码(Registry code)
TweakJS使用Robert Pittenger的(TweakJS uses Robert Pittenger’s) CRegistry
类(class) 读取和写入注册表.此处包含的版本包含(to read from and write to the registry. The version included here incorporates) 聚醚醚酮(PEK) 的更改,以将Unicode支持添加到(’s changes to add Unicode support to) ReadString
和(and) WriteString
.我变了(. I changed) WriteDword
指定(to specify) REG_DWORD
代替(instead of) REG_BINARY
,并添加了一个有用的(, and added a useful) EnumerateKeys
功能,如下所示:(function, shown here:)
void CRegistry::EnumerateKeys(CStringArray &saReturn)
{
//SetKey MUST be called beforehand.
ASSERT(m_strCurrentPath.GetLength() > 0);
//Set up return array.
saReturn.RemoveAll();
HKEY hKey;
if (::RegOpenKeyEx(m_hRootKey, LPCTSTR(m_strCurrentPath),
0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
return;
//Get some sizes to make life easier.
DWORD dwNumKeys, dwMaxNameLength, dwSize;
LONG lResult = RegQueryInfoKey(hKey, 0, 0, 0,
&dwNumKeys, &dwMaxNameLength, 0,
0, 0, 0, 0, 0);
//Include room for a NULL in the buffer length
dwMaxNameLength++;
TCHAR *pBuffer = new TCHAR[dwMaxNameLength];
for(unsigned int i=0; i < dwNumKeys; i++)
{
dwSize = dwMaxNameLength;
lResult = RegEnumKeyEx(hKey, i, pBuffer,
&dwSize, 0,0,0,0);
if(lResult == ERROR_SUCCESS)
saReturn.Add(pBuffer);
}
delete[] pBuffer;
}
CRegistry
被调用以写入三个不同的位置:TweakJS的注册表位置,其设置保存位置,常见Windows对话框的位置以及MS Office的位置.如前所述,MS Office和Windows的格式不同.我选择使用与Windows相同的格式保存TweakJS的设置,因为我发现它更具吸引力.(is called upon to write to three different locations: TweakJS’s registry location, where its settings are saved, the location for common Windows dialogs, and the location for MS Office. As was noted earlier, the formats differ for MS Office and Windows. I opted to save TweakJS’s settings using the same format that Windows does, as I found it to be more appealing.)
检测Microsoft Office(Detecting Microsoft Office)
通过检查注册表以查找注册到Windows XP的可执行文件的路径来查询MS Office的版本是很好的.(It would be nice to query the version of MS Office by checking the registry to find the path of the executable registered to the).doc(.doc*)*文件扩展名,然后使用(*file extension, and then using*) FileVersionEx
检索版本.我选择了懒惰的出路,只是为Office 97\2000,XP和2003中的每一个查找注册表项.(*to retrieve the version. I opted for the lazy way out, simply looking for the registry key for each of Office 97, 2000, XP, and 2003.*)
[编辑注释:换行符用于避免滚动.]([Editor comment: Line breaks used to avoid scrolling.])
float fVer = 8.0f;
bool bFound = false;
CString sOfficeRoot;
while (!bFound && fVer < 12.0f)
{
sOfficeRoot.Format(_T("Software\\Microsoft\\
Office\\%1.1f\\Common\\Open Find\\Places"), fVer);
bFound =
m_pRegistry->KeyExists(sOfficeRoot, HKEY_CURRENT_USER);
fVer++;
}
//Display the installed version of office detected to the user.
m_sOfficeVer = _T("None");
if (bFound)
{
int iVer = fVer - 1.0f;
switch (iVer)
{
case 8:
m_sOfficeVer =
_T("Office 97");//Unlikely/Impossible to run into this.
break;
case 9:
m_sOfficeVer = _T("Office 2000");
break;
case 10:
m_sOfficeVer = _T("Office XP");
break;
case 11:
m_sOfficeVer = _T("Office 2003");
break;
default:
ASSERT(FALSE);
}
}
捷径(Shortcuts)
快捷方式代码通过提供(The shortcut code was provided via) PJ诺特(PJ Naughter) 易于使用(’s easy-to-use) CShellLink
类(class) .(.)
兴趣点(Points of interest)
通常,尽管这个项目看起来很琐碎,但这里还是提出了一些有趣的观点:(As is usually the case, despite this project’s trivial appearance, there are several interesting points that are presented here:)
-
在MS Office中,某些特殊文件夹未显示其预期名称.例如,显示为"共享文档"的文件夹实际上是一个名为”(Some special folders don’t show up with their expected names in MS Office. For example, the folder that is displayed as Shared Documents is actually a folder named “)文件资料(Documents)在(” in)C:\ Documents and Settings \所有用户(C:\Documents and Settings\All Users).为了检索显示给用户的名称,我使用了(. To retrieve the name that is displayed to the user, I used the)
SHGetFileInfo
外壳调用(shell call) 并指定(and specified)SHGFI_DISPLAYNAME
.(.) -
在研究TweakJS之前,我曾经遇到过(Until I worked on TweakJS, I used to encounter the)
REG_EXPAND_SZ
数据说明符,同时编辑注册表.在调查TweakUI的行为时,我注意到它将某些字符串写为(data specifier while editing the registry. While investigating the behavior of TweakUI, I noticed that it writes certain strings out as)REG_EXPAND_SZ
到注册表.使用(to the registry. Using)PathUnExpandEnvStrings
(文档((documentation) 这里(here) ),可以将路径转换为以下形式(), it is possible to convert a path in the form)C:\ Documents and Settings \ User \ Folder(C:\Documents and Settings\User\Folder)至(to)%USERPROFILE%\文件夹(%USERPROFILE%\Folder*)*.(*.*)PathUnExpandEnvStrings
适用于环境变量中存储的其他几个位置,例如(*works for several other locations that are stored in the environment variables, such as the*)*C:\ Windows(*C:\Windows*)*和(*, and*)*C:\ Program档案(*C:\Program Files*)*,甚至返回系统驱动器的位置(在我展示的示例中,(*, even returning the location of the system drive (in the examples that I’ve shown, it’s*)*C:(*C:*)*)为(*) as*)*%SystemDrive%(*%SystemDrive%*)*.此函数的反函数是(*. The inverse of this function is*)ExpandEnvironmentStrings
.值得注意的是,Microsoft Office读取(*. It is worth noting that Microsoft Office reads*)REG_SZ
(常规字符串)来自注册表,并且不支持使用(*(regular strings) from the registry, and does not support the use of*)REG_EXPAND_SZ
.(*.*)**注意(*Note*)**:由于使用了TweakJS,因此需要平台SDK来构建TweakJS(*: Platform SDK is required to build TweakJS because of its use of*)ExpandEnvironmentStrings
和(*and*)PathUnExpandEnvStrings
.(*.*) -
尽管使用Unicode构建是相当标准的做法,但我没有养成这样做的习惯.我发现,除了使代码符合Unicode之外,还需要执行以下步骤将Unicode构建配置添加到我的项目中:(Although building in Unicode is a fairly standard practice, I haven’t made a habit of doing it. I found that in addition to making the code Unicode-compliant, the following steps were necessary to add Unicode build configurations to my project:)
- 从"生成"菜单中选择"配置".(Choose Configurations from the Build menu.)
- 添加" Unicode调试"-复制Win32调试.(Add “Unicode Debug” - Copy Win32 Debug.)
- 添加" Unicode版本"-复制Win32版本.(Add “Unicode Release” - Copy Win32 Release.)
- 单击确定.(Click OK.)
- 从项目菜单中选择设置.(Choose Settings from the Project menu.)
- 转到常规标签.(Go to the General tab.)
- 对于" Win32 Unicode调试",将"中间文件"和"输出文件"设置为DebugU.(For “Win32 Unicode Debug”, set Intermediate Files and Output Files to DebugU.)
- 对于" Win32 Unicode版本",将"中间文件"和"输出文件"设置为ReleaseU.(For “Win32 Unicode Release”, set Intermediate Files and Output Files to ReleaseU.)
- 转到" C ++“选项卡.(Go to the C++ tab.)
- 从组合框中选择"预处理器”.(Choose “Preprocessor” from the combo-box.)
- 对于" Win32 Unicode调试"和" Win32 Unicode版本",添加(For “Win32 Unicode Debug” and “Win32 Unicode Release”, add)
_UNICODE
和(and)UNICODE
预处理器变量列表.(to the list of preprocessor variables.) - 转到链接选项卡.(Go to the Link tab.)
- 从组合框中选择"输出".(Choose “Output” from the combo-box.)
- 输入(Enter)
wWinMainCRTStartup
在入口点符号框中.(in the Entry Point Symbol box.)
注意事项(Caveats)
MS Office 2002/XP和2003的用户可以轻松更新其(Users of MS Office 2002/XP and 2003 can easily update their)我的位置栏(My Places Bar)通过酒吧本身.请参阅Microsoft的知识库文章(through the bar itself. See Microsoft’s Knowledge Base article) KB 826214(KB 826214) .(.)
精明的读者会注意到TweakJS的组合框中没有出现"我的电脑"和"网上邻居".这是因为它们是无法解析为路径的虚拟文件夹,因此MS Office无法显示它们.甚至将路径字符串设置为文件夹的CLSID((The astute reader will notice that My Computer and Network Neighborhood don’t appear in TweakJS’s combo boxes. This is because they are virtual folders that don’t resolve to a path, and hence cannot be displayed by MS Office. Even setting the path string to the CLSID of the folder () ::{20d04fe0-3aea-1069-a2d8-08002b30309d}
对于我的电脑和(for My Computer and) ::{208D2C60-3AEA-1069-A2D7-08002B30309D}
(对于"网上邻居")无效.如果您还没有打开"运行"对话框(“开始” |“运行…")并输入其中一个字符串的快感,请尝试一下.我选择不提供它们,而不是显示这些选项并使它们在MS Office中无法正常工作.如果您知道解决方法,请与我联系.我将更新代码,并将其归功于您.(for My Network Places) didn’t work. If you haven’t experienced the thrill of opening the Run dialog (Start | Run …) and typing in one of those strings, give it a shot. Rather than displaying these options and have them work incorrectly in MS Office, I opted not to offer them. If you know of a workaround, please contact me. I’ll update the code and credit you for the same.)
致谢(Acknowledgements)
这些年来,CodeProject丰富的文章集对我非常有用.我将这作为我的第一篇文章提供给CP社区,以换取我从CP伙伴那里学到的所有知识.特别感谢我在这里使用过代码的CP成员,以及Marc Clifton的贡献(CodeProject’s rich collection of articles has been very useful to me over the years. I offer this, my first article, to the CP community, in return for all I’ve learned from my fellow CPians. Special thanks go to the CP members whose code I have used here, and to Marc Clifton, for his) 编写代码项目文章指南(Guide to Writing Articles for Code Project) .(.)
历史(History)
- 1.0版-初始版本.(Version 1.0 - Initial release.)
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
C++ VC6 WinXP Windows Win2K MFC Visual-Studio Dev 新闻 翻译