C++ - 从 MFC 应用程序启动记事本,并将其默认标题从 "Untitled - Notepad" 更改为其他内容

C++ - Launch Notepad from an MFC application and change its default title from "Untitled - Notepad" to something else

本文关键字:Notepad Untitled 其他 标题 启动 应用程序 MFC 记事本 C++ 默认      更新时间:2023-10-16

我在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...
}

记事本中用于更改默认文件名的命令行选项集有限.exe。但是您可以像这样指定新文件名,如果它不存在,提示将允许您将其作为新文档打开。

sei.lpFile = L"notepad.exe";
sei.lpParameters = L""Readme.txt"";  

使用 CreateProcess() 创建记事本进程。

使用WaitForInputIdle()等待窗口变为可用。(注意:此方法可能无法可靠地工作,请按照此建议实现 WinEvents 方法(。

使用主线程 ID(从 PROCESS_INFORMATION 获取(上的EnumThreadWindows()获取记事本窗口句柄。

最后,将窗口手柄上的SendMessage()WM_SETTEXT一起使用,将窗口标题更改为所需的任何内容。

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);

您也可以设置默认文件名或路径。