日期:2014-05-18  浏览次数:20881 次

求助:拦截系统消息
求助:我想要拦截系统的按键消息。想要屏蔽SHIFT+方向键,具体消息代码是多少不知道,也没有找到这个消息列表

C# WINFORM


现在用一个LISTVIEW控件,它自带一个热键,SHIFT+上下,是多选用的。但是现在这个热键我想要干别的用。不想让这个消息走到控件这一步。 


现在找到之前见到的一段代码,这个是屏蔽了系统的关闭窗体的消息。我想用同样的方式做,但是不知道SHIFT+ 方向键的消息该如何写判断。
  protected override void WndProc(ref Message m)
  {
  const int WM_SYSCOMMAND = 0x0112;
  const int SC_CLOSE = 0xF060;
  if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
  {
  return;
  }

  base.WndProc(ref m);
  }


另外还看到这样的代码,消息过滤器。但是写好类了不知道怎么用。看了网上的文字,很糊涂。求解!


 internal class MessageFilter : IMessageFilter 
  {
  public virtual bool PreFilterMessage(ref Message m)  
  { 
  //if里根据自己的需要进行判断判断 m.HWnd为控件句柄 m.Msg为消息ID  
  if (true) 
  {
  //返回值为true, 表示消息已被处理,不要再往后传递,因此消息被截获  
  return true;
  }
  //返回值为false,表示消息未被处理,需要再往后传递,因此消息未被截获  
  return false;  
  }  
  public void AddThisMessageFilter()  
  { 
  //添加该消息筛选器  
  Application.AddMessageFilter(this);
  }  
  public void RemoveThisMessageFilter()  
  { //移除该消息筛选器  
  Application.RemoveMessageFilter(this);  
  } 
  }

有资料不会用,真是郁闷。希望能帮忙的写的详细一些。。我没啥基础。。。

------解决方案--------------------
WindowsAPI 最大的特点就是 没有中文翻译(似乎也没有发现管发布过什么API手册之类的。。。只有英文的那些东东...)

你只能去msdn 查英文资料了
不过。。。
当然也有捷径 ,就是谷歌 搜索 。。。
------解决方案--------------------
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)判断是否按下shift键,然后在判断方向键
------解决方案--------------------
截获键盘的消息,碰到时Shift+上下就做你自己的事。
------解决方案--------------------
http://www.cnblogs.com/heimirror/archive/2010/03/29/1699857.html
------解决方案--------------------
http://www.cnblogs.com/heimirror/archive/2010/03/29/1699857.html
------解决方案--------------------
Application.AddMessageFilter(IMessageFilter)
------解决方案--------------------
因为消息被派送到TextBox句柄上了而TextBox并没有重写WinProc,重写TextBox的WinProc就可以拦截到了
------解决方案--------------------
试试通过把windowform的keypreview属性打开,捕获keydown事件进行处理。
------解决方案--------------------
你通过Debug.Write(m.Msg)你会发现键盘消息在你说的那种情况下是无法让窗体捕获的。

所以建议你通过把windowform的keypreview属性打开,捕获keydown事件进行处理。 

------解决方案--------------------
WM_KEYDOWN和WM_KEYUP的 wParam就是虚拟键码,MSDN上可以查到,也可以通过VkKeyScan将一个字符转换成虚拟键码和shift状态的结合。

lParam的0到15位为该键在键盘上的重复次数,经常设为1,即按键1次;16至23位为键盘的扫描码,通过MapVirtualKey配合其参数可以得到;24位为扩展键,即某些右ALT和CTRL;29、30、31位按照说明设置即可(第30位对于keydown在和shift等结合的时候通常要设置为1)。

 

Specification of WM_KEYDOWN:

wParam

Specifies the virtual-key code of the nonsystem key. 
lParam
Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table.