有一个第三方控件Devexpress 的TextEdit
用Spy ++可以看到有 WM_Paste事件,但是用代码却不能得到这个消息代码如下 private const int WM_GETTEXT = 0x000d;
private const int WM_COPY = 0x0301;
private const int WM_PASTE = 0x0302;
private const int WM_CONTEXTMENU = 0x007B;
private const int WM_RBUTTONDOWN = 0x0204;
public const int WM_CHAR = 0x0102;
public const int GWL_WNDPROC = -4;
public delegate IntPtr NewWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, NewWndProc wndproc); [DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
//没用到
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); private NewWndProc wpr = null; //备份的默认处理函数
private IntPtr oldWndProc = IntPtr.Zero; private IntPtr GridControlWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
IntPtr returnVar = IntPtr.Zero;
switch (msg)
{
case WM_PASTE:
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
string str;
str = (String)iData.GetData(DataFormats.Text);
}
return (IntPtr)0;
}
// 回调备份的默认处理的函数
returnVar = CallWindowProc(oldWndProc, hWnd, msg, wParam, lParam);
return returnVar;
}
private void gridView1_ShownEditor(object sender, EventArgs e)
{
if (gridView1.ActiveEditor != null&& gridView1.ActiveEditor is DevExpress.XtraEditors.TextEdit)
{
oldWndProc = GetWindowLong(textEdit1.Handle, GWL_WNDPROC);
wpr = new NewWndProc(this.GridControlWndProc);
oldWndProc = SetWindowLong(textEdit1.Handle, GWL_WNDPROC, wpr);
}
}断点的时候也有事件~~
也挺多,但是却没有WM_PASTE消息这是为什么呢?
用Spy ++可以看到有 WM_Paste事件,但是用代码却不能得到这个消息代码如下 private const int WM_GETTEXT = 0x000d;
private const int WM_COPY = 0x0301;
private const int WM_PASTE = 0x0302;
private const int WM_CONTEXTMENU = 0x007B;
private const int WM_RBUTTONDOWN = 0x0204;
public const int WM_CHAR = 0x0102;
public const int GWL_WNDPROC = -4;
public delegate IntPtr NewWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, NewWndProc wndproc); [DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
//没用到
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); private NewWndProc wpr = null; //备份的默认处理函数
private IntPtr oldWndProc = IntPtr.Zero; private IntPtr GridControlWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
IntPtr returnVar = IntPtr.Zero;
switch (msg)
{
case WM_PASTE:
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
string str;
str = (String)iData.GetData(DataFormats.Text);
}
return (IntPtr)0;
}
// 回调备份的默认处理的函数
returnVar = CallWindowProc(oldWndProc, hWnd, msg, wParam, lParam);
return returnVar;
}
private void gridView1_ShownEditor(object sender, EventArgs e)
{
if (gridView1.ActiveEditor != null&& gridView1.ActiveEditor is DevExpress.XtraEditors.TextEdit)
{
oldWndProc = GetWindowLong(textEdit1.Handle, GWL_WNDPROC);
wpr = new NewWndProc(this.GridControlWndProc);
oldWndProc = SetWindowLong(textEdit1.Handle, GWL_WNDPROC, wpr);
}
}断点的时候也有事件~~
也挺多,但是却没有WM_PASTE消息这是为什么呢?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货