如何使用Notepad ++作为7zip的编辑器,而不显示控制台窗口?

时间:2017-09-09 21:51:03

标签: batch-file cmd notepad++ 7zip

要将Notepad ++用作7zip的编辑器,您需要使用--track-origins=no|yes show origins of undefined values? [no] 命令行参数启动notepad++.exe,否则它会立即关闭并转发现有实例的参数。由于7zip会在调用的程序关闭时获取您对其临时文件所做的更改,因此您永远无法编辑它。

问题是,7zip不允许您为您正在配置为编辑器的任何程序输入参数。

已经尝试过的明显的解决方案:

  • 调用一个批处理文件,但是在版本期间我遇到了一个难看的(并且容易意外关闭)控制台窗口 - 这是不可接受的。
  • 调用使用-multiInst来调用Notepad ++的批处理文件:无法正常工作,被调用的批处理文件立即关闭,因此Notepad ++已完成编辑,即回到初始问题。

你会怎么做?没有我自己尝试过或者读过的解决方案已经完全令人满意。

2 个答案:

答案 0 :(得分:1)

我最终编写了自己的实用程序,暂时将其称为 NoConsoleProgramLauncher 以充当 7z 和 Notepad++ 之间的中间件。这是粗略的初稿代码,但我认为分享它可能仍然有用,因为这个问题已经三年没有答案了。

#include <fstream>
#include <string>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <filesystem>

HINSTANCE hInst;

void launchProcess(std::wstring commandLine);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    //Get current executable's location
    HMODULE hModule = GetModuleHandleW(NULL);
    WCHAR executableFolder[MAX_PATH];
    GetModuleFileNameW(hModule, executableFolder, MAX_PATH);
    std::experimental::filesystem::v1::path path(executableFolder);
    path.remove_filename();
    path.append(L"NoConsoleProgramLauncher_Arguments.txt");
    std::wifstream infile(path);
    std::wstring commandLine;
    std::getline(infile, commandLine);
    commandLine += L" ";
    commandLine += lpCmdLine;
    launchProcess(commandLine);
}

void launchProcess(std::wstring commandLine)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    // Start the child process. 
    if (!CreateProcess(NULL,   // No module name (use command line)
        &commandLine[0],        // Command line - C++ 11 guarantees that string's internal buffer is contiguous and null-terminated.
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        CREATE_NO_WINDOW,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi)           // Pointer to PROCESS_INFORMATION structure
        )
    {
        printf("CreateProcess failed (%d).\n", GetLastError());
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject(pi.hProcess, INFINITE);

    // Close process and thread handles. 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

基本上,如果您之前做过最少的 C++ 编码,只需将其粘贴到新的 Visual Studio 2017 Windows 桌面应用程序项目中,根据需要修复包含,然后构建.

正如您在源代码中看到的那样,当启动可执行文件时,它会在与自身相同的文件夹中查找名为“NoConsoleProgramLauncher_Arguments.txt”的文件,并调用它在其中找到的命令行。如问题中所述,不会显示任何控制台窗口,并且程序将在退出之前等待生成的进程终止,因此 7zip 会一直等待获取更改

这是我放入 NoConsoleProgramLauncher_Arguments.txt 文件的内容:

"C:\Program Files (x86)\Notepad++\notepad++.exe" -multiInst -nosession

在 7zip 配置中,我将编辑器设置为指向我的 NoConsoleProgramLauncher.exe 程序。

真正的解决方案当然是轻轻地纠缠 7z 作者,或者更好的是,向 7z 提交拉取请求以实现向您选择的编辑器传递参数。

答案 1 :(得分:0)

批处理文件怎么样

start "" /b "notepad++.exe" -multiInst $*
exit