110,534
社区成员
发帖
与我相关
我的任务
分享
<RichTextBox Height="405" HorizontalAlignment="Left" Margin="12,83,0,0" Name="rtb"
VerticalAlignment="Top" Width="476" Grid.Row="1" Background="#FFEDD364" KeyUp="rtb_KeyUp" MouseUp="rtb_MouseUp">
HwndSource hs = PresentationSource.FromVisual(rtb) as HwndSource;
hs.AddHook(new HwndSourceHook(rtbWinProc));
private IntPtr rtbWinProc(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (WINAPI.sysMsg.ContainsKey(Msg))
{
App.lg.Write(WINAPI.sysMsg[Msg]);
}
return IntPtr.Zero;
}
public static class WINAPI
{
public static Dictionary<int, string> sysMsg;
static WINAPI()
{
sysMsg = new Dictionary<int, string>();
sysMsg.Add(0x0006, "窗口被激活或失去激活");
sysMsg.Add(0x001C, "哪个窗口是激活的,哪个是非激活");
sysMsg.Add(0x030C, "通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字");
sysMsg.Add(0x004B, "当某个用户取消程序日志激活状态,提交此消息给程序");
sysMsg.Add(0x001F, "发送此消息来取消某种正在进行的摸态(操作)");
sysMsg.Add(0x0215, "发送此消息给窗口当它失去捕获的鼠标时");
sysMsg.Add(0x030D, "当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口");
sysMsg.Add(0x0102, "此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息");
sysMsg.Add(0x002F, "此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息");
sysMsg.Add(0x0022, "发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小");
sysMsg.Add(0x0303, "程序发送此消息给editcontrol或combobox清除当前选择的内容");
sysMsg.Add(0x0010, "当一个窗口或应用程序要关闭时发送一个信号");
sysMsg.Add(0x0111, "当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译");
sysMsg.Add(0x0041, "显示内存已经很少了");
sysMsg.Add(0x0039, "发送此消息来判定combobox或listbox新增加的项的相对位置");
sysMsg.Add(0x007B, "当用户某个窗口中点击了一下右键就发送此消息给这个窗");
sysMsg.Add(0x0301, "当一个应用程序传递数据给另一个应用程序时发送此消息");
sysMsg.Add(0x004A, "当一个应用程序传递数据给另一个应用程序时发送此消息");
sysMsg.Add(0x0302, "程序发送此消息给editcontrol或combobox从剪贴板中得到数据");
}
}
既然是 拷贝,赋值 不能从它的keydown事件入手么
wpf程序中,RichTextBox只能拦截一部分消息(比如鼠标右键消息),但是无法拦截WM_COPY、WM_PASTE消息,有解决办法吗? 部分代码如下: //拦截目标为一个RichTextBox<RichTextBox Height="405" HorizontalAlignment="Left" Margin="12,83,0,0" Name="rtb" VerticalAlignment="Top" Width="476" Grid.Row="1" Background="#FFEDD364" KeyUp="rtb_KeyUp" MouseUp="rtb_MouseUp">
//回调函数HwndSource hs = PresentationSource.FromVisual(rtb) as HwndSource; hs.AddHook(new HwndSourceHook(rtbWinProc));
//预先定义的消息private IntPtr rtbWinProc(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (WINAPI.sysMsg.ContainsKey(Msg)) { App.lg.Write(WINAPI.sysMsg[Msg]); } return IntPtr.Zero; }
public static class WINAPI { public static Dictionary<int, string> sysMsg; static WINAPI() { sysMsg = new Dictionary<int, string>(); sysMsg.Add(0x0006, "窗口被激活或失去激活"); sysMsg.Add(0x001C, "哪个窗口是激活的,哪个是非激活"); sysMsg.Add(0x030C, "通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字"); sysMsg.Add(0x004B, "当某个用户取消程序日志激活状态,提交此消息给程序"); sysMsg.Add(0x001F, "发送此消息来取消某种正在进行的摸态(操作)"); sysMsg.Add(0x0215, "发送此消息给窗口当它失去捕获的鼠标时"); sysMsg.Add(0x030D, "当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口"); sysMsg.Add(0x0102, "此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息"); sysMsg.Add(0x002F, "此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息"); sysMsg.Add(0x0022, "发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小"); sysMsg.Add(0x0303, "程序发送此消息给editcontrol或combobox清除当前选择的内容"); sysMsg.Add(0x0010, "当一个窗口或应用程序要关闭时发送一个信号"); sysMsg.Add(0x0111, "当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译"); sysMsg.Add(0x0041, "显示内存已经很少了"); sysMsg.Add(0x0039, "发送此消息来判定combobox或listbox新增加的项的相对位置"); sysMsg.Add(0x007B, "当用户某个窗口中点击了一下右键就发送此消息给这个窗"); sysMsg.Add(0x0301, "当一个应用程序传递数据给另一个应用程序时发送此消息"); sysMsg.Add(0x004A, "当一个应用程序传递数据给另一个应用程序时发送此消息"); sysMsg.Add(0x0302, "程序发送此消息给editcontrol或combobox从剪贴板中得到数据"); } }