如何设置Word文档的文件名而不将其保存在c#和自动化II中

HCL*_*HCL 7 ms-word office-interop

我在这里一个关于如何通过自动化设置Word文档的文件名而不保存它的问题.感谢Remou,通过调用FileSummaryInfo-Dialog并设置Title-property,我收到了一个很好的方法.

但是现在我遇到的问题是客户端希望文档名称中包含特殊字符(点和下划线),而且它似乎是单词的一个错误(或一个特性),它会削减标题并且仅在字符之前占用字符.用于构建文件名的第一个特殊字符!我已经google了很多,但无法找到解决此问题的方法.这里也注意到这个问题(参见下面的问题),但没有解决方案.

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

whu*_*nmr 5

尝试easyhook,因为这些天除了我的手之外没有Windows机器.以下就是呼叫流程(就像我多年前所做的那样,通过Detours将软件的套接字绑定端口更改为不同的一个)

关于Hook CreateFileW:

easyhook的wiki中的示例正是我们想要的.

CreateFileHook = LocalHook.Create(
                    LocalHook.GetProcAddress("kernel32.dll", "CreateFileW"),
                    new DCreateFile(CreateFile_Hooked),
                    this);
Run Code Online (Sandbox Code Playgroud)

CreateFile_Hooked您可以更改参数InFileName,然后调用真正的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);
}
Run Code Online (Sandbox Code Playgroud)

呼叫流程:

将标题更改为"My_Document_2012_11_29"后,然后挂钩Word的CreateFileW进程.例如,当InFileName是"My.doc"时,您应该将其更改为"My_Document_2012_11_29".

因为这是在Word进程中完成的,所以Detoured函数不知道"My.doc"映射到"My_Document_2012_11_29".获取此映射信息的方法很多,一种是将此映射信息保存到应用程序中的已知文件,并在Detoured函数中读取该文件.