Ms word 如何设置Word文档的文件名而不从c#和automation II保存它

Ms word 如何设置Word文档的文件名而不从c#和automation II保存它,ms-word,office-interop,Ms Word,Office Interop,我问了一个问题,关于如何通过自动化设置Word文档的文件名而不保存它。多亏了Remou,我收到了一个很好的方法,通过调用FileSummaryInfo对话框并设置Title属性来实现这一点 但是现在我遇到了一个问题,客户端希望文档名中有特殊字符(点和下划线),这似乎是word的一个缺陷(或一个特性),它会剪切标题,并且只在构建文件名的第一个特殊字符之前取字符!我已经在谷歌上搜索了很多,但是没有找到解决这个问题的方法。 这个问题也被注意到了(参见下面的gotcha),但是没有解决方案 有没有其他解

我问了一个问题,关于如何通过自动化设置Word文档的文件名而不保存它。多亏了Remou,我收到了一个很好的方法,通过调用FileSummaryInfo对话框并设置Title属性来实现这一点

但是现在我遇到了一个问题,客户端希望文档名中有特殊字符(点和下划线),这似乎是word的一个缺陷(或一个特性),它会剪切标题,并且只在构建文件名的第一个特殊字符之前取字符!我已经在谷歌上搜索了很多,但是没有找到解决这个问题的方法。 这个问题也被注意到了(参见下面的gotcha),但是没有解决方案

有没有其他解决方案来设置文件名而不保存文件名,或者针对上述奇怪行为的解决方法/错误修复方法?

试试看,因为这些天除了我的手之外,没有Windows机器。 下面是调用流程(类似于我几年前所做的,将软件的套接字绑定端口逐个更改为不同的端口)

关于钩住CreateFileW:

中的示例正是我们在这里想要的

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方法。