Question

Vous cherchez des astuces, des conseils et des termes de recherche pour modifier le texte dans une fenêtre de win32 de C #.

Plus précisément, je suis en train de changer le texte sur la boîte de dialogue d'impression de « Imprimer » à « OK », comme je suis en utilisant la boîte de dialogue pour créer un ticket d'impression et ne pas faire une impression.

Comment puis-je trouver la poignée de la fenêtre de la boîte de dialogue? Une fois que je l'ai, comment pourrais-je faire pour trouver le bouton dans les fenêtres de l'enfant de la forme? Une fois que je l'ai trouvé que, comment pourrais-je modifier le texte sur le bouton? Et comment puis-je faire tout cela avant que le dialogue est affiché?

Il y a une question similaire, mais elle pointe vers un article CodeProject qui est waaay plus complexe que nécessaire et me prend un peu plus de temps pour analyser à travers que je voudrais passer à ce sujet. TIA.

Était-ce utile?

La solution

Vous devez utiliser Spy ++ pour jeter un oeil à la boîte de dialogue. Le nom de classe est importante et l'ID de contrôle du bouton. S'il est une boîte de dialogue de Windows natif alors le nom de la classe doit être « # 32770 ». Dans ce cas, vous aurez beaucoup d'utilisation pour mon poste dans ce fil. Voici une autre en C # . Vous pouvez modifier le texte du bouton par P / Invoquer SetWindowText () sur la poignée de bouton.


using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class SetDialogButton : IDisposable {
    private Timer mTimer = new Timer();
    private int mCtlId;
    private string mText;

    public SetDialogButton(int ctlId, string txt) {
        mCtlId = ctlId;
        mText = txt;
        mTimer.Interval = 50;
        mTimer.Enabled = true;
        mTimer.Tick += (o, e) => findDialog();
    }

    private void findDialog() {
        // Enumerate windows to find the message box
        EnumThreadWndProc callback = new EnumThreadWndProc(checkWindow);
        if (!EnumThreadWindows(GetCurrentThreadId(), callback, IntPtr.Zero)) mTimer.Enabled = false;
    }
    private bool checkWindow(IntPtr hWnd, IntPtr lp) {
        // Checks if <hWnd> is a dialog
        StringBuilder sb = new StringBuilder(260);
        GetClassName(hWnd, sb, sb.Capacity);
        if (sb.ToString() != "#32770") return true;
        // Got it, get the STATIC control that displays the text
        IntPtr hCtl = GetDlgItem(hWnd, mCtlId);
        SetWindowText(hCtl, mText);
        // Done
        return true;
    }
    public void Dispose() {
        mTimer.Enabled = false;
    }

    // P/Invoke declarations
    private const int WM_SETFONT = 0x30;
    private const int WM_GETFONT = 0x31;
    private delegate bool EnumThreadWndProc(IntPtr hWnd, IntPtr lp);
    [DllImport("user32.dll")]
    private static extern bool EnumThreadWindows(int tid, EnumThreadWndProc callback, IntPtr lp);
    [DllImport("kernel32.dll")]
    private static extern int GetCurrentThreadId();
    [DllImport("user32.dll")]
    private static extern int GetClassName(IntPtr hWnd, StringBuilder buffer, int buflen);
    [DllImport("user32.dll")]
    private static extern IntPtr GetDlgItem(IntPtr hWnd, int item);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern bool SetWindowText(IntPtr hWnd, string txt);
}

Utilisation:

        using (new SetDialogButton(1, "Okay")) {
            printDialog1.ShowDialog();
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top