WinAPI метод SetWindowText не меняет текст кнопки. Причем, если попробовать получить текст через GetWindowText, то вернется, как раз, тот текст, который я пытался задать, а не отображаемый по факту. Забавно, но заголовок формы меняется, в отличии от кнопки, вызов метода из другого потока (с выключенным CheckForIlligalCross) и Invalidate кнопки ожидаемо не дают результата.
Upd. Примеры кода:
Класс WinAPI
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(HandleRef hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetWindowText(IntPtr hWnd, [MarshalAs(UnmanagedType.LPTStr)] string lpString);
Класс Window
public static Window Find(IntPtr hwnd)
{
return new Window()
{
Handle = hwnd
};
}
public string GetText()
{
int capacity = WinAPI.GetWindowTextLength(new HandleRef(this, Handle)) * 2;
StringBuilder stringBuilder = new StringBuilder(capacity);
WinAPI.GetWindowText(new HandleRef(this, Handle), stringBuilder, stringBuilder.Capacity);
return stringBuilder.ToString();
}
public bool SetText(string text)
{
return WinAPI.SetWindowText(Handle, text);
}
Код формы:
button1.Click += (s, e) =>
{
var btn = Window.Find(button1.Handle);
btn.SetText("hello");
MessageBox.Show(btn.GetText());
};
Результат на скрине.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей