Domanda

In cerca di consigli, suggerimenti e termini di ricerca per la modifica del testo in una finestra Win32 da C #.

In particolare, sto cercando di modificare il testo nella finestra di dialogo di stampa dalla "Stampa" a "OK", come io sto usando la finestra di dialogo per creare un biglietto di stampa e non fare qualsiasi stampa.

Come posso trovare handle di finestra della finestra di dialogo? Una volta che ho capito, come potrei fare per trovare il pulsante nelle finestre figlio della forma? Una volta ho trovato che, come faccio a modificare il testo sul pulsante? E come posso fare tutto questo prima che venga mostrata la finestra di dialogo?

C'è una domanda simile qui, ma punta a un articolo CodeProject che è mooolto più complessa di quanto necessario e mi sta prendendo un po 'più tempo per analizzare attraverso di quanto mi piacerebbe passare su questo. TIA.

È stato utile?

Soluzione

Si consiglia di utilizzare Spy ++ per dare un'occhiata alla finestra di dialogo. Il nome della classe è importante e l'ID di controllo del pulsante. Se si tratta di una finestra nativa di Windows, allora il nome della classe deve essere "# 32770". Nel qual caso avrete un sacco di utilizzare per il mio post in questo filo . Ecco un'altra in C # . È possibile modificare il testo del pulsante da P / Invocazione SetWindowText () sulla maniglia tasto.


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

Utilizzo:

        using (new SetDialogButton(1, "Okay")) {
            printDialog1.ShowDialog();
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top