¿Cómo puedo cambiar el texto en una ventana de Win32?
-
28-09-2019 - |
Pregunta
Búsqueda de pistas, consejos y buscar términos para cambiar el texto en una ventana de Win32 de C #.
Más específicamente, estoy tratando de cambiar el texto en el cuadro de diálogo de impresión de la "impresión" a "OK", como yo estoy usando el cuadro de diálogo para crear un ticket de impresión y no hacer ninguna impresión.
¿Cómo puedo encontrar identificador de ventana del diálogo? Una vez que lo tengo, ¿cómo iba a ir sobre la búsqueda en el botón de las ventanas secundarias de la forma? Una vez que me he dado cuenta que, ¿cómo podría cambiar el texto en el botón? Y ¿cómo puedo hacer todo esto antes de que se muestre el diálogo?
Hay una pregunta similar aquí, pero apunta a un artículo que es CodeProject MUUCHO más complejo de lo necesario y me lleva un poco más de tiempo a analizar a través de lo que me gustaría para gastar en esto. TIA.
Solución
Debe utilizar Spy ++ para echar un vistazo a la ventana de diálogo. El nombre de la clase es importante y el ID de control del botón. Si se trata de un cuadro de diálogo de Windows nativo, entonces el nombre de la clase debe ser "# 32770". En este caso usted tiene una gran cantidad de uso de mi puesto en este enhebrar . Aquí es otro en C # . Cambia el texto del botón de P / Invocación SetWindowText () en el mango botón.
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);
}
Uso:
using (new SetDialogButton(1, "Okay")) {
printDialog1.ShowDialog();
}