将消息WM_SETTEXT发送到文本框不会触发文本更改事件
本文关键字:文本 事件 WM 消息 SETTEXT | 更新日期: 2023-09-27 17:56:57
我有代码获取文本框控件的句柄并使用Windows API更改文本。更新文本时,不会触发 TextChanged 事件。
有没有办法使用 Windows API 触发 TextBox.TextChanged 事件?
[更新]
我认为事件不触发的原因是文本框句柄是通过 DCOM 接口发送的。该程序 是 一个 用 c# 编写 的 NI TestStand 外壳, 使用 NI TestStand COM 对象 实现 核心 功能。在 TS 序列文件(一种 TS 脚本语言)中,我为文本框句柄创建了一个对象引用,并使用 shell 窗体的加载事件中的 TS api 对其进行设置。之后,我将句柄发送到我的 c# DLL。我使用发送消息来更新文本框,效果很好。问题是 TextChanged 事件不会触发。
我尝试使用 TS 接口发送文本框和 TextChanged 委托,但无法让它工作。我认为通过 TS COM 对象执行此操作存在应用程序域问题。
正如此程序所证明的那样,当向控件发送WM_SETTEXT
消息时,TextChanged
事件会触发。
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
const uint WM_SETTEXT = 0x000C;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, unit Msg,
IntPtr wParam, string lParam);
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show(textBox1.Text);
}
private void button1_Click(object sender, EventArgs e)
{
SendMessage(textBox1.Handle, WM_SETTEXT, IntPtr.Zero,
textBox1.Text + ", " + textBox1.Text);
}
}
}
请注意,这个答案的原始版本过于复杂,并使用了这样的SendMessage
:
static extern IntPtr SendMessage(IntPtr hWnd, unit Msg,
IntPtr wParam, IntPtr lParam);
因此必须执行手动编组:
IntPtr text = Marshal.StringToCoTaskMemUni(textBox1.Text + ", "
+ textBox1.Text);
SendMessage(textBox1.Handle, WM_SETTEXT, IntPtr.Zero, text);
Marshal.FreeCoTaskMem(text);
对这个问题的评论(字符串DllImport参数的自动转换与Marshal.StringToCoTaskMemUni)说服我更新。
我不确定您要更改什么文本,但我在文本框中使用了PostMessages和按键(用于数字)的组合,它会触发TextChangedEvent。
看看这个方法2。它基本上设置鼠标单击文本框,然后将您想要的文本的按键发送到文本框(逐个字母)。