[英]C++ - Launch Notepad from an MFC application and change its default title from "Untitled - Notepad" to something else
我在 Windows 上使用以下代码成功打开记事本实例。 如何将其默认标题从“无标题 - 记事本”更改为其他内容?
SHELLEXECUTEINFO sei = { 0 };
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = my_hWnd; // this window's handle
sei.lpVerb = L"open";
sei.lpFile = L"notepad.exe";
sei.lpParameters = NULL;
sei.lpDirectory = NULL;
sei.nShow = SW_SHOW;
sei.hInstApp = NULL;
if (ShellExecuteEx(&sei))
{
// do some other stuff...
}
Notepad.exe 中用于更改默认文件名的命令行选项集有限。 但是您可以像这样指定新文件名,如果它不存在,则会提示您将其作为新文档打开。
sei.lpFile = L"notepad.exe";
sei.lpParameters = L"\"Readme.txt\"";
使用CreateProcess()
创建记事本进程。
使用WaitForInputIdle()
等待窗口变为可用。 (注意:此方法可能无法可靠运行,请遵循此建议来实施 WinEvents 方法)。
在主线程 ID(从PROCESS_INFORMATION
获得EnumThreadWindows()
上使用EnumThreadWindows()
来获取记事本窗口句柄。
最后,在窗口句柄上使用带有WM_SETTEXT
SendMessage()
将窗口标题更改为您喜欢的任何内容。
BOOL CALLBACK EnumThreadWndProc(HWND hWnd, LPARAM lParam)
{
HWND hWndNp = hWnd;
SendMessageW(hWndNp, WM_SETTEXT, 0, (WPARAM)L"Hello");
return 0; // ...stop enum
}
int main() {
STARTUPINFOW si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessW(
NULL, _tcsdup(TEXT("notepad")),
NULL, NULL, FALSE, 0, NULL, NULL,
&si, &pi)
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return 0;
}
if (0 == WaitForInputIdle(pi.hProcess, 5000))
{
EnumThreadWindows(pi.dwThreadId,
EnumThreadWndProc, NULL);
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
这对我有用
CString strFile("C:\\test.txt");
char sz[MAX_PATH];
wsprintf(sz, "Notepad.exe %s", strFile);
WinExec(sz, SW_SHOW);
您也可以设置默认文件名或路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.