wpf拦截系统消息失败(不能拦截复制粘贴消息)

flyhorse1010 2014-07-29 11:26:10
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从剪贴板中得到数据");
}
}
...全文
231 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
blueberry321 2015-09-25
  • 打赏
  • 举报
回复
敢问楼主是怎么解决的,碰到同样的问题了!赐教
exception92 2014-07-31
  • 打赏
  • 举报
回复
引用 3 楼 flyhorse1010 的回复:
引用 1 楼 duanzi_peng 的回复:
既然是 拷贝,赋值 不能从它的keydown事件入手么
只是copy有从键盘和鼠标右键2个方式,键盘的好处理,鼠标右键的不太好处理。
怎么解决的??是拦截Window是消息吗??分享一下。
exception92 2014-07-29
  • 打赏
  • 举报
回复
既然是 拷贝,赋值 不能从它的keydown事件入手么
flyhorse1010 2014-07-29
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
既然是 拷贝,赋值 不能从它的keydown事件入手么
只是copy有从键盘和鼠标右键2个方式,键盘的好处理,鼠标右键的不太好处理。
flyhorse1010 2014-07-29
  • 打赏
  • 举报
回复
只是copy有从键盘和鼠标右键2个方式,键盘的好处理,鼠标右键的不太好处理。
引用 楼主 flyhorse1010 的回复:
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从剪贴板中得到数据");       
        } 
    }

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧