如何使用 Notepad++ 作为 7zip 的编辑器,而不显示控制台 window?
How to use Notepad++ as editor for 7zip, without showing a console window?
这个问题可以概括为:如何启动一个给定的进程,并且派生的任何中间进程与启动的进程具有相同的生命周期,并且不显示控制台window.特定的参数必须传递给最终过程,但在初始调用中不能传递参数.
要将 Notepad++ 用作 7zip 的编辑器,您需要使用 -multiInst
命令行参数启动 notepad++.exe
,否则它会立即关闭并将参数转发到现有实例。由于 7zip 会在调用的程序关闭时获取您对其临时文件所做的更改,因此您永远没有机会编辑它。
问题是,7zip 不允许您为配置为编辑器的任何程序输入参数。
已经尝试过的明显无效的解决方案:
- 调用一个批处理文件,但在版本期间,我遇到了一个难看的(而且很容易意外关闭)控制台 window - 不可接受。
- 调用一个使用
start
调用 Notepad++ 的批处理文件:控制台 window 确实关闭了,但不幸的是,Notepad++ 正在监视的批处理执行程序进程已经消失,所以它认为你'已经完成编辑,即回到最初的问题。
- 使用不显示控制台的 wscript window。然而,跟踪进程生命周期很复杂 (Wait for program to complete),它使您在维护模式下依赖具有恶意软件含义的旧技术。
你会怎么做?我自己尝试或阅读的解决方案都没有完全令人满意。
注意:这与 Execute Batch File without Command line visible 的问题不完全相同,因为它有额外的要求,即无论使用什么启动器,都必须在启动进程的整个生命周期内保持打开状态,并且您不能传递命令启动器的行参数。
我最终编写了自己的实用程序,我暂时将其称为 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”的文件,并调用它在其中找到的命令行。如问题中所述,不会显示控制台 window,程序将等待生成的进程终止后再退出,因此 7zip 一直在等待接收更改 .
这是我放入 NoConsoleProgramLauncher_Arguments.txt
文件的内容:
"C:\Program Files (x86)\Notepad++\notepad++.exe" -multiInst -nosession
并且在 7zip 配置中,我将编辑器设置为指向我的 NoConsoleProgramLauncher.exe 程序。
真正的解决方案当然是就此轻轻地纠缠 7z 作者,或者更好的是,向 7z 提交拉取请求以实现向您选择的编辑器传递参数。
这个问题可以概括为:如何启动一个给定的进程,并且派生的任何中间进程与启动的进程具有相同的生命周期,并且不显示控制台window.特定的参数必须传递给最终过程,但在初始调用中不能传递参数.
要将 Notepad++ 用作 7zip 的编辑器,您需要使用 -multiInst
命令行参数启动 notepad++.exe
,否则它会立即关闭并将参数转发到现有实例。由于 7zip 会在调用的程序关闭时获取您对其临时文件所做的更改,因此您永远没有机会编辑它。
问题是,7zip 不允许您为配置为编辑器的任何程序输入参数。
已经尝试过的明显无效的解决方案:
- 调用一个批处理文件,但在版本期间,我遇到了一个难看的(而且很容易意外关闭)控制台 window - 不可接受。
- 调用一个使用
start
调用 Notepad++ 的批处理文件:控制台 window 确实关闭了,但不幸的是,Notepad++ 正在监视的批处理执行程序进程已经消失,所以它认为你'已经完成编辑,即回到最初的问题。 - 使用不显示控制台的 wscript window。然而,跟踪进程生命周期很复杂 (Wait for program to complete),它使您在维护模式下依赖具有恶意软件含义的旧技术。
你会怎么做?我自己尝试或阅读的解决方案都没有完全令人满意。
注意:这与 Execute Batch File without Command line visible 的问题不完全相同,因为它有额外的要求,即无论使用什么启动器,都必须在启动进程的整个生命周期内保持打开状态,并且您不能传递命令启动器的行参数。
我最终编写了自己的实用程序,我暂时将其称为 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”的文件,并调用它在其中找到的命令行。如问题中所述,不会显示控制台 window,程序将等待生成的进程终止后再退出,因此 7zip 一直在等待接收更改 .
这是我放入 NoConsoleProgramLauncher_Arguments.txt
文件的内容:
"C:\Program Files (x86)\Notepad++\notepad++.exe" -multiInst -nosession
并且在 7zip 配置中,我将编辑器设置为指向我的 NoConsoleProgramLauncher.exe 程序。
真正的解决方案当然是就此轻轻地纠缠 7z 作者,或者更好的是,向 7z 提交拉取请求以实现向您选择的编辑器传递参数。