我需要find当前版本的Windows正在使用的一些string。 例如,当我创build一个新文件夹时,它最初在英文版Vista上被命名为“新build文件夹”。 我需要以编程方式查找该文件夹将在我可能运行的任何语言和版本的Windows上命名。
任何人有任何想法如何做到这一点?
感谢Morinar – 我也偶然发现了这篇文章。 不幸的是,stringID似乎不是常量 – 它在我的Vista上是30396,这与他们为XP显示的不一样。 所以看起来MS并没有保持稳定。
编辑:看起来这是不可能的…? 这个应用程序运行在德国,荷兰,法国,西class牙,巴西,墨西哥,越南,台湾,中国,日本,韩国,印度,以色列,匈牙利的计算机上…你明白了。 安装所有不同的语言包需要很长的时间,并找出每种语言的“新build文件夹”。
也许最好的select是默认为“新build文件夹”,并让用户更改该值,如果他们想。 我只是希望尽可能多地找出软件,并让用户不要configuration_yet_another_setting_。
无耻地从http://blogs.msdn.com/oldnewthing/archive/2004/01/30/65013.aspx cribbed。 这是最正确的,但如果有一个“新文件夹别的东西”资源字符串它将匹配:
LPCWSTR FindStringResourceEx(HINSTANCE hinst, UINT uId, UINT langId) { // Convert the string ID into a bundle number LPCWSTR pwsz = NULL; HRSRC hrsrc = FindResourceEx(hinst, RT_STRING, MAKEINTRESOURCE(uId / 16 + 1), langId); if (hrsrc) { HGLOBAL hglob = LoadResource(hinst, hrsrc); if (hglob) { pwsz = reinterpret_cast<LPCWSTR> (LockResource(hglob)); if (pwsz) { // okay now walk the string table for (int i = 0; i < (uId & 15); i++) { pwsz += 1 + (UINT)*pwsz; } pwsz+= 1; } } } return pwsz; } UINT FindResourceStringId(HMODULE resource_handle, LPCWSTR string, UINT langId) { UINT resource_id= -1; for (int i= 0; i<65536; ++i) { LPCWSTR resource_string= FindStringResourceEx(resource_handle, i, langId); if (resource_string && wcsncmp(resource_string, string, wcslen(string))==0) { resource_id= i; } } return resource_id; } int main() { HMODULE shell_handle= LoadLibraryW(L"shell32.dll"); UINT new_folder_id= FindResourceStringId(shell_handle, L"New Folder", 0x409); // look for US English "New Folder" resource id. }
这并不容易。 这些字符串是Windows资源管理器的私有数据,因此它们可以(也可能)在不同版本之间进行更改。 你可以在那里进行大量的版本检查,并阅读适当的资源字符串,但这似乎是一场失败的战斗。 你想达到什么目的?
不确定是否有一个更优雅的方式(我似乎无法找到一个),但这些字符串存储在%windir%\System32\Shell32.dll
。 理论上讲,你可以只读取该文件并提取适当的字符串。
看起来有点乱七八糟,但应该完成工作。 这里有一篇文章的链接,讨论他们在上述文件中的位置: http : //www.askvg.com/customize-new-folder-and-new-shortcut-text-in-windows-xp/
似乎有可能,甚至应该是他们通过Windows API的接口,但通过文件拖动,我找不到一个。 也许你会有更多的运气。
如果你想处理80%的案例,你可以从“新建文件夹”开始。
因为我猜你是在一个企业环境中,你可以将文件夹名称存回存储器,然后在一个星期(或任何时间)之后,通过名称获得; 更新你的应用程序 发布新版本,以取悦用户。 (然后在这里发布结果)
您可以在怀疑用户使用的一系列平台上预先测试您的应用。 获得第一系列的文件夹名称。
这将避免处理您正在查看的每个平台的特定代码的问题。
编辑好吧,我还有一个想法,我想你可能要警告用户有关“新文件夹”,如果它不是一段时间后(如一分钟)重命名? 那么我想你会需要添加一个列表和一个计时器…