1

我正在编写一个小脚本(我在 AutoHotKey 中的第一个脚本)将带有语法高亮的 Notepad++ 代码复制到 OneNote。它的工作原理是首先按下“将 HTML 复制到剪贴板”条目,将其粘贴到一个新的 MSWord 文档中并再次从那里剪切,因此结果现在在剪贴板中。

直接将 HTML 复制到 OneNote 不起作用,因为那里忽略了换行符(Microsoft 的问题,而不是 notepad++。看这里:http ://tech.lanesnotes.com/2012/05/pasting-code-to-onenote-with -formatting.html)。但是如果你将它复制到 Word 而不是 OneNote,它突然就可以工作了......

我的问题:到目前为止,我编写的代码有效,但前提是 Word 之前运行过。如果它必须首先启动,则脚本将失败并且仅在新的 Word 文档中打印一个“n”。我非常感谢任何可以帮助我的人。

编辑 2:我忘了提:我使用的是德语版的 Notepad++ 和 Word,所以按下的键可能不适合您... -> 将第一个发送更改为 !p (英文)。

;This script is used to copy notepad++-Syntax-Higlighting
;to clipboard in a format OneNote can read.
SetTitleMatchMode 2
#c::
IfWinActive, Notepad++
{
    send !p
    send n
    send {Right}
    send c
    send c
    send {Enter}


    Run winword.exe
    WinWaitActive, Microsoft Word
    WinActivate
    send ^v
    send ^a
    send ^x
    WinClose
    send n
}

SetTitleMatchMode 1
return

PS.:如果您喜欢此功能,请随意使用此代码。如果您有更好的想法或建议如何使其变得更好,请告诉我。

4

3 回答 3

2

您可以使用 COM 对象而不是发送击键。

Wd := ComObjCreate("Word.Application") ;creates a new MS Word object
Wd.Documents.Add() ;adds a document
rng := Wd.ActiveDocument.Range(0,0) ;creates a range object at the
                                    ; start of the doc
rng.Paste() ;pastes the contents of the clipboard into the range object
rng.Copy() ;copies the range object into the clipboard
Wd.Quit(0) ;quits without saving changes
于 2014-01-19T06:20:59.743 回答
1

我相信小加载矩形(有技术名称吗?)算作“Microsoft Word”窗口,并且它是活动的。我的解决方案,刚才对我有用(不保证!),是在包含默认文件名的 Word 窗口上等待,如下所示:

WinWaitActive Document1 - Microsoft Word

这对你有用吗?如果德语版本默认为“Document1”以外的其他内容,请将其放在那里。

现在,这将导致您出现问题的地方是,当您运行此脚本时已经打开了 Document1。

编辑:这也对我有用:

WinWaitActive ahk_class MsoSplash
WinWaitActive Microsoft Word

第二个解决方案可能会更成问题,因为它只有在运行 winword 之前没有打开 Word 窗口时才有效。

编辑二:以下内容如何为您工作?

;This script is used to copy notepad++-Syntax-Higlighting
;to clipboard in a format OneNote can read.
SetTitleMatchMode 2
#c::
IfWinActive, Notepad++
{
    send !p
    send n
    send {Right}
    send c
    send c
    send {Enter}

    IfWinNotExist, ahk_class OpusApp
    {
        Run winword.exe
        WinWait, ahk_class MsoSplash
        WinWait, Microsoft Word
    }
    else
    {
        Run winword.exe
    }
    WinActivate, Microsoft Word
    send ^v
    send ^a
    send ^x
    ; WinClose
    Send !{F4}
    send n
}
SetTitleMatchMode 1
return

编辑三:我替换WinCloseSend !{F4},这似乎效果更好。

第四号编辑:我在条件之后移动了 WinActivate,以便它适用于两种情况,如评论中所建议的那样。

于 2014-01-15T16:53:57.673 回答
0

在 Notepad++ 中,您可以对其进行设置,以便查看所有字符。

单击查看 --> 显示符号 --> 显示所有字符。

然后您可以准确地看到哪些字符被用于换行符。

然后,将其复制并粘贴到 word 中并返回记事本,并比较出现在行尾的特殊字符。

然后,您可以使用 Notepad++ 或 AutoHotkey 相应地查找和替换行尾字符。

于 2014-01-15T16:43:19.537 回答