Ms word 如何设置Word文档的文件名而不从c#和automation II保存它
我问了一个问题,关于如何通过自动化设置Word文档的文件名而不保存它。多亏了Remou,我收到了一个很好的方法,通过调用FileSummaryInfo对话框并设置Title属性来实现这一点 但是现在我遇到了一个问题,客户端希望文档名中有特殊字符(点和下划线),这似乎是word的一个缺陷(或一个特性),它会剪切标题,并且只在构建文件名的第一个特殊字符之前取字符!我已经在谷歌上搜索了很多,但是没有找到解决这个问题的方法。 这个问题也被注意到了(参见下面的gotcha),但是没有解决方案 有没有其他解决方案来设置文件名而不保存文件名,或者针对上述奇怪行为的解决方法/错误修复方法?试试看,因为这些天除了我的手之外,没有Windows机器。 下面是调用流程(类似于我几年前所做的,将软件的套接字绑定端口逐个更改为不同的端口) 关于钩住CreateFileW: 中的示例正是我们在这里想要的Ms word 如何设置Word文档的文件名而不从c#和automation II保存它,ms-word,office-interop,Ms Word,Office Interop,我问了一个问题,关于如何通过自动化设置Word文档的文件名而不保存它。多亏了Remou,我收到了一个很好的方法,通过调用FileSummaryInfo对话框并设置Title属性来实现这一点 但是现在我遇到了一个问题,客户端希望文档名中有特殊字符(点和下划线),这似乎是word的一个缺陷(或一个特性),它会剪切标题,并且只在构建文件名的第一个特殊字符之前取字符!我已经在谷歌上搜索了很多,但是没有找到解决这个问题的方法。 这个问题也被注意到了(参见下面的gotcha),但是没有解决方案 有没有其他解
CreateFileHook = LocalHook.Create(
LocalHook.GetProcAddress("kernel32.dll", "CreateFileW"),
new DCreateFile(CreateFile_Hooked),
this);
在CreateFile\u Hooked
中,可以更改参数InFileName
,然后调用real CreateFileW
static IntPtr CreateFile_Hooked(
String InFileName,
UInt32 InDesiredAccess,
UInt32 InShareMode,
IntPtr InSecurityAttributes,
UInt32 InCreationDisposition,
UInt32 InFlagsAndAttributes,
IntPtr InTemplateFile)
{
// FIGURE OUT THE FILE NAME THAT YOU WANT HERE
// IF the InFileName is not your Document name "My.doc", then call orignal CreateFile
// with all the parameter unchanged.
// call original API...
return CreateFile(
YOUR_CHANGED_FILE_NAME_HERE,
InDesiredAccess,
InShareMode,
InSecurityAttributes,
InCreationDisposition,
InFlagsAndAttributes,
InTemplateFile);
}
呼叫流:
在您将标题更改为“我的文档\u 2012\u 11\u 29”之后,
然后钩住Word进程的CreateFileW。
例如,当填充名为“My.doc”时,
然后您应该将其更改为“我的文档”2012 11 29
因为这是在Word进程中完成的,所以绕道函数不知道
“My.doc”正在映射到“My_Document_2012_11_29”。
有很多方法可以获取此映射信息,一种是将此映射信息保存到
应用程序中的已知文件,并在Detoured函数中读取该文件。点和下划线是什么意思?@Blam:“.”和“\ux”。例如“我的文件”2012年11月29日或“我的文件”2012.11.29日。这两个文档都将命名为“My.doc”。您也可以在无需自动化的情况下测试该行为:创建一个新的空白文档,将文档标题(在“文档属性”对话框中)设置为上述标题之一,然后点击ctrl-S。这是内置的Word行为,您无法破解它。请注意,任何标点符号都会将其缩短,包括破折号、斜杠或逗号。但不是一个空间。您正看到Word试图从一个长标题合成一个短文件名。这里也有报道:@Hans Passant:这是个不幸的消息。然而,我认为会是这样的,但是希望最后消失了……还要注意,如果你不设置标题,那么它会尝试从文档的第一段合成一个文件名。完全相同的行为。谢谢你创造性的解决方案。但是,如果我正确理解您的解决方案,则在客户端保存文件后(单击“保存文件”对话框中的“确定”),名称将更改。这意味着在“保存文件”对话框中,将显示简短的标题(My.doc),而不是标题?但是,在“保存文件”对话框中正确显示文件名很重要。但同样:很好的解决方案-谢谢@盐酸,是的,你是对的。也许我们需要在这里钩住SetWindowText方法。