Notepad++ 等待Word启动的问题

Notepad++ 等待Word启动的问题,notepad++,autohotkey,onenote,Notepad++,Autohotkey,Onenote,我正在编写一个小脚本(我第一次使用自动热键)将带有语法高亮显示的记事本++代码复制到OneNote。它的工作原理是首先按下“将HTML复制到剪贴板”条目,将其粘贴到新的MSWord文档中,然后从那里再次剪切,因此结果现在位于剪贴板中 直接将HTML复制到OneNote不起作用,因为在OneNote中会忽略换行符(这是Microsoft的问题,而不是notepad++。请看这里:)。但如果您将其复制到Word而不是OneNote,它会突然起作用 我的问题是:到目前为止,我编写的代码是有效的,但前提

我正在编写一个小脚本(我第一次使用自动热键)将带有语法高亮显示的记事本++代码复制到OneNote。它的工作原理是首先按下“将HTML复制到剪贴板”条目,将其粘贴到新的MSWord文档中,然后从那里再次剪切,因此结果现在位于剪贴板中

直接将HTML复制到OneNote不起作用,因为在OneNote中会忽略换行符(这是Microsoft的问题,而不是notepad++。请看这里:)。但如果您将其复制到Word而不是OneNote,它会突然起作用

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

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


注:如果您喜欢此功能,请随意使用此代码。如果您有更好的想法或建议,请告诉我。在记事本++中,您可以设置它,以便查看所有字符

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

然后您可以确切地看到换行符使用的字符

然后,将其复制粘贴到word中,再将其粘贴回记事本中,并比较行尾显示的特殊字符


然后,您可以使用记事本++或自动热键相应地查找并替换行尾字符。

我认为小加载矩形(是否有技术名称?)算作“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
编辑第三条:我将
WinClose
替换为
Send!{F4}
,这似乎效果更好


编辑第四条:我将WinActivate移动到条件之后,以便它适用于这两种情况,如注释中所建议的那样。

您可以使用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

如果“将RTF复制到剪贴板”,会发生什么?OneNote能处理粘贴的富文本吗?不,我试过了,但你甚至没有粘贴选项。另一方面,MSWord的html和rtf做得非常完美……我无法重现您的问题。在不使用
WinClose
和不使用
send n
(块的最后两行)的情况下运行脚本,将生成包含所需格式的剪贴板,可直接粘贴到OneNote中。也就是说,在粘贴到OneNote之前关闭Word将不起作用;奇怪的是,结束语似乎恢复了NppExport生成的剪贴板。找出脚本在您的计算机上失败的确切位置(运行word、激活、粘贴等)。这到目前为止仍然有效,但窗口保持打开状态。我尝试了“WinClose,ahk_class OpusApp”而不是WinClose,但是如果有其他窗口打开,我会遇到问题。尝试
Send!{F4}
。很多这只是尝试和错误的各种搜索自动热键网站。这几乎是完美的。但是,如果我不知道,在
发送^v
之前,你必须添加
睡眠,50
,我的记事本++会关闭…当AHK对应用程序来说速度太快时,我不明白为什么记事本++会关闭。它是否只是运行了Notepad++中的所有命令,因此根本无法使用Word?因此,我研究了使用PID来识别新窗口,因为我认为问题在于在已经有打开的窗口时运行Word。Word似乎不能很好地使用
Run、winword.exe、MyPID
。这与非打印字符无关。这是OneNote2010在html解析方面遇到的一个问题。我知道notpad++在这方面的功能。对不起,这个想法似乎很完美,但我从这段代码中得到的只是rng.Paste(命令失败)和rng.Copy(后续错误->未选择文本)的两个错误。您是否仔细检查以确保剪贴板中有文本?
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