求助:拦截系统消息
求助:我想要拦截系统的按键消息。想要屏蔽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.