7

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

但是现在我遇到的问题是客户希望在(点和下划线)中包含带有特殊字符的文档名称,并且它似乎是单词的一个错误(或一个功能),它削减了标题并且只在用于构建文件名的第一个特殊字符!我已经用谷歌搜索了很多,但是无法找到解决此问题的方法。此处也注意到了该问题(请参阅问题下方),但没有解决方案。

有没有人在不保存的情况下设置文件名的另一种解决方案,或者提到的奇怪行为的解决方法/错误修复?

4

1 回答 1

5

试试easyhook吧,因为这几天除了我手边没有Windows机器。以下只是调用流程(就像我几年前所做的那样,通过Detours将软件的套接字绑定端口更改为不同的端口)

关于 Hook CreateFileW:

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

CreateFileHook = LocalHook.Create(
                    LocalHook.GetProcAddress("kernel32.dll", "CreateFileW"),
                    new DCreateFile(CreateFile_Hooked),
                    this);

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);
}

通话流程:

将标题更改为“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 函数中读取该文件。

于 2012-12-05T15:52:56.953 回答