急用,在线等------关于HOOK的问题,只要代码能实现都可的分,但要看代码的技术来定给分多少

csdnlooklb 2005-05-17 02:32:30
在VB.NET中想屏蔽系统键如Alt+Tab,Win键,使其在程序进行时不起作用。自己也写了几个但都达不到自己想要的效果。请各位高手帮忙
...全文
159 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
李察德-泰森 2005-05-26
  • 打赏
  • 举报
回复
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keydata As System.Windows.Forms.Keys) As Boolean
'屏蔽 Alt + F4
Dim WM_KEYDOWN As Integer = 256
Dim WM_SYSKEYDOWN As Integer = 260
If ((msg.Msg = WM_KEYDOWN) Or (msg.Msg = WM_SYSKEYDOWN)) Then
Select Case keydata
Case Keys.Alt + Keys.F4
Return (True)
End Select
End If
End Function

你自己根據需要再修改吧
APP开发王 2005-05-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/wgsnet/archive/2005/03/25/329956.aspx
Snrmnm_sx 2005-05-26
  • 打赏
  • 举报
回复
我也想告诉,帮楼主UPUPUP!
pupo 2005-05-26
  • 打赏
  • 举报
回复
楼上的只是在窗体获得焦点时可以屏蔽部分键吧,对于失去焦点或系统键根本没有作用
pupo 2005-05-25
  • 打赏
  • 举报
回复
给个C#的

using System;
using System.Runtime.InteropServices;

namespace Hook
{
/// <summary>
/// 设置键盘钩子屏蔽win键
/// </summary>
public class Win32Hook
{
public Win32Hook()
{

}

private IntPtr hHook =IntPtr.Zero;

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

public const int WH_KEYBOARD = 13;

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(IntPtr idHook);

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("kernel32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
private static extern IntPtr GetModuleHandle(string lpModuleName);

[StructLayout(LayoutKind.Sequential)]
public struct KBDLLHOOKSTRUCT
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}


private int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
KBDLLHOOKSTRUCT kb = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));

if (nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
if (kb.vkCode != 91)
return CallNextHookEx(hHook, nCode, wParam, lParam); //不等于win键时
else
return 1;//等于win键时吃掉键盘消息
}
}

//设置Hook
public bool Hook()
{
if (hHook == IntPtr.Zero)
{
HookProc KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
hHook = SetWindowsHookEx(WH_KEYBOARD, KeyBoardHookProcedure, GetModuleHandle("Hook.dll") ,0);
if(hHook == IntPtr.Zero)
return false;
else
return true;
}
else
return true;
}

//取消Hook
public bool UnHook()
{
if (hHook != IntPtr.Zero)
{
bool ret = UnhookWindowsHookEx(hHook);
hHook = IntPtr.Zero ;
return ret;
}
else
return true;
}
}
}


调用
Hook.Win32Hook hook;

private void button1_Click(object sender, System.EventArgs e)
{
if (hook.Hook() == false)
MessageBox.Show("失败");
}

private void Form1_Load(object sender, System.EventArgs e)
{
hook = new Hook.Win32Hook();
}

private void button2_Click(object sender, System.EventArgs e)
{
if (hook.UnHook() == false)
MessageBox.Show("失败");
}
pupo 2005-05-25
  • 打赏
  • 举报
回复
Win32Hook这个类必须单独写到一个DLL中去,改动hHook = SetWindowsHookEx(WH_KEYBOARD, KeyBoardHookProcedure, GetModuleHandle("Hook.dll") ,0)到相应的DLL即可.
这里的按键值处理可能不是很好,我测试了下按win键它得到的键值为91.具体你可以参看下
API中KBDLLHOOKSTRUCT 结构和CallNextHookEx中lParam参数的说明


csdnlooklb 2005-05-19
  • 打赏
  • 举报
回复
怎么没人来看一下呀,UP
  • 打赏
  • 举报
回复
在CSDN的原来的数据库里已经有了这个代码了。
你去找找看看的
我昨天还看了的
csdnlooklb 2005-05-18
  • 打赏
  • 举报
回复
winform
athossmth 2005-05-17
  • 打赏
  • 举报
回复
winform or webform?
csdnlooklb 2005-05-17
  • 打赏
  • 举报
回复
up

16,552

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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