如本程序所證明的,當控件發送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);
對這個問題的評論(Automatic casting for string DllImport arguments vs Marshal.StringToCoTaskMemUni)說服我更新。
我有一個問題,爲什麼不使用'Marshal.StringToHGlobalUni'? –
@AppDeveloper你也可以使用它。兩種方式都無關緊要。我傾向於使用pinvoke來進行COM堆棧,因爲如果編組人員會解除分配,那麼它會使用COM堆棧。 –
對不起,但只是爲了好奇,COM堆是如何區別於正常的非託管內存指針的? –