0
votes

C ++ - Lancez Notepad à partir d'une application MFC et modifie son titre par défaut de "Sans titre - Notepad" à quelque chose d'autre

J'utilise la pièce de code suivante sur Windows pour ouvrir une instance de bloc-notes. Comment puis-je modifier son titre par défaut de "Untitled - Notepad" à quelque chose d'autre? XXX


2 commentaires

Pourquoi utilisez-vous shellexecuteex () pour cela? Vous n'ouvrez pas un document, vous démarrez un processus, vous devez donc utiliser CreateProcess () à la place. ShellexecuTex () va commencer un nouveau processus de toute façon, alors découpez l'intermédiaire.


Vous ne pouvez pas. Le titre de la fenêtre est géré par l'application et vous ne savez pas comment cela le fait. La vie secrète de GetWindowtext explique comment Windows peut gérer leur fenêtre Titres.


3 Réponses :


0
votes

Il existe un ensemble limité d'options de ligne de commande dans NOTEPAD.EXE pour modifier le nom de fichier par défaut. Mais vous pouvez spécifier le nouveau nom de fichier comme si cela n'existe pas, une invite vous permettra de l'ouvrir en tant que nouveau document.

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


7 commentaires

Cette solution n'est pas mauvaise, mais je voulais que le Notepad s'ouvre sans afficher l'invite. Pouces vers le haut!


Ouais, bien sûr, cela répond à la question "Comment puis-je modifier son titre par défaut [...] à quelque chose d'autre?" , à condition que "autre" est toujours censé se terminer dans "- Notepad" . Il ne fournit pas de solution générale. @mel: quelle invite?


@IInSpectable Si vous spécifiez un nom de fichier pour un fichier qui n'existe pas, le bloc-notes vous invitera à la créer. Je préférerais que ce ne soit pas, mais c'est probablement son comportement par défaut et est inévitable. J'ai même essayé Setwindowtext () qui a travaillé pour une fraction de seconde (observée cela dans le débogueur), puis le bloc-notes le réinitialisait.


Pour éviter cette invite, créez simplement un fichier vide et passez son nom. Cependant, il n'est toujours pas clair que OP a voulu voir dans le titre modifié ...


@Vladfeinstein Je préfère ne pas créer de fichier sur disque. Dans le recul, j'aurais dû mentionner cela dans le message principal, mais je n'étais pas sûr de la quantité de détails dont je devrais inclure.


@ Melanie93 - Je pense que cette question a déjà montré deux fois: qu'est-ce que vous voulez voir exactement dans le titre?


Le titre doit être une chaîne de mon choix, mais je ne pense pas que ce soit possible, sauf si je crée le fichier sur disque. Utiliser SetWindowtext () fonctionne temporairement et puis Notepad réinitialise le titre. Dois-je fermer cette question?



0
votes

Utilisez CreateProcess () code> pour créer le processus de bloc-notes.

Utiliser waitforinputidle () code> Pour attendre que la fenêtre soit disponible. (Remarque: cette approche peut ne pas fonctionner de manière fiable, suivez Cette recommandation de mettre en œuvre l'approche Winevents). P>

Utiliser énumthreadwindows () code> sur l'ID de thread principal (obtenu à partir de process_information code>) pour obtenir la poignée de la fenêtre de bloc-notes. P>

Enfin, utilisez sendmessage () code> avec wm_settexte code> sur la fenêtre de la fenêtre pour modifier le titre de la fenêtre sur tout ce que vous voulez. P>

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


2 commentaires

waitForinPutiveDle ne fait pas ce que vous pensez que c'est .


Ah ok. Toujours travaillé pour moi, mais je suppose que la documentation est trompeuse. Je vais laisser l'OP implémenter l'approche Winevents (ou crochets) comme recommandé.



0
votes

Ceci fonctionne pour moi

CString strFile("C:\\test.txt");
char sz[MAX_PATH];
wsprintf(sz, "Notepad.exe %s", strFile);
WinExec(sz, SW_SHOW);


0 commentaires