Frage

Suche nach Hinweisen, Tipps und Suchbegriffe für die Änderung des Textes auf einem win32 Fenster von C #.

Genauer gesagt, ich versuche, den Text auf dem Druckdialog von „Drucken“ auf „OK“ zu ändern, da ich den Dialog bin mit einem Druck Ticket zu erstellen und jeden Druck nicht tun.

Wie kann ich das Fenster-Handle des Dialogs finden? Sobald ich es habe, wie würde ich mich über den Button in den untergeordneten Fenster des Formulars zu finden? Sobald ich das gefunden habe, wie würde ich den Text auf der Schaltfläche ändern? Und wie kann ich alle dies tun, bevor der Dialog angezeigt wird?

Es gibt eine ähnliche Frage hier, aber es deutet auf einen Artikel Codeproject, die waaay komplexer als nötig ist und ich ein bisschen länger, um durch zu analysieren, als ich auf diese verbringen möchte. TIA.

War es hilfreich?

Lösung

Sie sollten Spy ++ verwenden, um einen Blick auf den Dialog zu nehmen. Der Klassenname ist wichtig, und die Steuer-ID der Schaltfläche. Wenn es ein native Windows-Dialog ist dann sollte der Klassenname sein „# 32770“. In diesem Fall werden Sie eine Menge für die Verwendung für meine Post haben in diesem fädeln . Hier ist href="https://stackoverflow.com/questions/2259027/messagebox-bold-text/2259213#2259213">. Sie auf die Schaltfläche Text ändern, indem P / Hervorrufen SetWindowText () auf die Schaltfläche Griff.


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

Verbrauch:

        using (new SetDialogButton(1, "Okay")) {
            printDialog1.ShowDialog();
        }
scroll top