在做WPF的客户端程序,需要屏蔽一些系统热键(顶着有份)

andy1020tc 2011-11-17 01:24:11
希望高手给与解答
需要屏蔽一些比如Ctrl+Alt+Delete Alt+Tab 之类的热键 实现锁屏效果
我没学过C和C++ 所以对网上的那些钩子的例子完全看不懂
就算比较全 也不会调用
所以希望能给完整点的例子 能让我知道如何调用
...全文
404 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy1020tc 2011-11-19
  • 打赏
  • 举报
回复
我是Lz 上面问题解决了
对了 谁知道怎么用Binding 我想使用binding控制窗体的背景
我的做法是Background="{Binding Path=imgPath}"
然后后台string imgPath;
在Loaded事件中 给imgPath赋值 imgPath="路径";
这样做没效果 我实在是搞不懂这个Binding 谁能给纠正下
有例子也行 分数一样给
http://topic.csdn.net/u/20111119/15/3deca1f7-c27e-41d1-a60f-1d29e06472fc.html
烟波钓 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 andy1020tc 的回复:]
引用 18 楼 fallincloud 的回复:

很容易啊。。
重载OnKeyDown函数
C# code

protected override void OnKeyDown(KeyEventArgs e)
{
if (Keyboard.Modifiers == ModifierKeys.Alt || Keyboard.Modifiers==ModifierKeys.Contr……
[/Quote]要是组合键的话 它们之间是是异或关系还是啥的 不是简简单单的与或者或的关系 楼主可以在查查
andy1020tc 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 fallincloud 的回复:]

很容易啊。。
重载OnKeyDown函数
C# code

protected override void OnKeyDown(KeyEventArgs e)
{
if (Keyboard.Modifiers == ModifierKeys.Alt || Keyboard.Modifiers==ModifierKeys.Control ||
……
[/Quote]
这个我试过了的 Alt+Tab实现不了 能帮我实现不?
fallincloud 2011-11-18
  • 打赏
  • 举报
回复
很容易啊。。
重载OnKeyDown函数

protected override void OnKeyDown(KeyEventArgs e)
{
if (Keyboard.Modifiers == ModifierKeys.Alt || Keyboard.Modifiers==ModifierKeys.Control ||
Keyboard.Modifiers== ModifierKeys.Windows|| Keyboard.Modifiers==ModifierKeys.Shift
)
{
e.Handled = true;
}
else
{
base.OnKeyDown(e);
}
}
andy1020tc 2011-11-18
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20111118/13/6ad366df-3e68-4015-b07d-b1208ea2d392.html
这个也是我的帖子 要是有实现了的 两边都回复下 采用的话 一下就是一两百分哦。。。。
andy1020tc 2011-11-18
  • 打赏
  • 举报
回复
我在网上找到代码了 在C#中实现了屏蔽 可是在WPF中 钩子安装不成功 键盘钩子句柄的值始终是0
这是为什么?
zl13793848035 2011-11-17
  • 打赏
  • 举报
回复
不会 还是支持吧
andy1020tc 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tory_yang 的回复:]

监视按键消息即可
C# code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.R……
[/Quote]
是不是复制你这代码 加两个按钮 btn1就是实现屏蔽了? 然后btn2就恢复了?
我在网上也找到不少例子 可就是不知道怎么调用 不知道怎么用他们的代码实现屏蔽热键
T3p0 2011-11-17
  • 打赏
  • 举报
回复
监视按键消息即可

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

IntPtr CurrHook; //得到钩子句柄


[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId(); //得到线程ID

[DllImport("user32.dll")]
//--------开始装钩子HookType:钩子类型,backCall:回调委托,MyNull:当前实例句柄,ThreadId:线程ID
public static extern IntPtr SetWindowsHookEx(int HookType, KeyBackCall backCall, IntPtr MyNull, int ThreadId);

[DllImport("user32.dll")]
public static extern IntPtr CallNextHookEx(IntPtr CurrHook, int nCode, IntPtr wParam, IntPtr lParam);


[DllImport("user32.dll")]
public static extern void UnhookWindowsHookEx(IntPtr CurrHook);

//----回调的委托
public delegate IntPtr KeyBackCall(int nCode, IntPtr wParam, IntPtr lParam);

//--------委托事件
public IntPtr KeyBackCallEvent(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode > 0)
{
MessageBox.Show(wParam.ToString());
return CallNextHookEx(CurrHook, nCode, wParam, lParam);
}
return CallNextHookEx(CurrHook, nCode, wParam, lParam);
}


private void button1_Click(object sender, EventArgs e)
{
CurrHook = SetWindowsHookEx(2, new KeyBackCall(KeyBackCallEvent), IntPtr.Zero, GetCurrentThreadId());

}



private void button2_Click(object sender, EventArgs e)
{
UnhookWindowsHookEx(CurrHook);

}

熙风 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 andy1020tc 的回复:]
引用 10 楼 happy09li 的回复:

C# code
if (isInSelectElement(pageText, inde, ref estrat, ref eend, ref etype) == true && (etype == 0 || etype == 2))//在选择类型的简单元素中
{
……

public int KeyBo……
[/Quote]

调用Hook_Start() 这个方法
andy1020tc 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 happy09li 的回复:]

C# code
if (isInSelectElement(pageText, inde, ref estrat, ref eend, ref etype) == true && (etype == 0 || etype == 2))//在选择类型的简单元素中
{
……
[/Quote]
public int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{}
这个不懂啊 什么地方调用他的? 怎么就能实现屏蔽呢
熙风 2011-11-17
  • 打赏
  • 举报
回复
     if (isInSelectElement(pageText, inde, ref estrat, ref eend, ref etype) == true && (etype == 0 || etype == 2))//在选择类型的简单元素中
{
startindex = richTextBox1.SelectionStart;
OnDoubleClick(null, null); //在选择元素中空白时 效果等于双击
//

}
else
{
Hook_Clear();
}


你在界面上放个富文本框,把上面那个方法换一下不是能正常用了
淘淘大师 2011-11-17
  • 打赏
  • 举报
回复
支持下
熙风 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 andy1020tc 的回复:]
引用 1 楼 happy09li 的回复:

C# code
#region 键盘钩子
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook = 0;
public const int WH_KEYBOARD_LL = 13;

public int star……
……
[/Quote]

老大,,那是完整的,,那报错的地方是因为没有界面,,所以会报错啊。。
andy1020tc 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tanghuawei 的回复:]

恩,利用键盘钩子是可以实现的
[/Quote]
有例子没啊 别光说啊 都纠结我一上午了 头都大了
andy1020tc 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gongchengjia 的回复:]

呵呵,是C#的么,c的我不太会哦,给你点思路吧,C#里可以监视客户按下的键值,然后你做判断,是要屏蔽的就不走程序,直接return. 不知道对你是否有帮助
[/Quote]
怎么获取键盘的值? 我用e.Key得到的是System 晕倒
tanghuawei 2011-11-17
  • 打赏
  • 举报
回复
恩,利用键盘钩子是可以实现的
andy1020tc 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happy09li 的回复:]

C# code
#region 键盘钩子
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook = 0;
public const int WH_KEYBOARD_LL = 13;

public int star……
[/Quote]
给完整的啊 大哥 看不懂啊 复制过去 几个红线 除了命名空间和富文本框意外
gongchengjia 2011-11-17
  • 打赏
  • 举报
回复
呵呵,是C#的么,c的我不太会哦,给你点思路吧,C#里可以监视客户按下的键值,然后你做判断,是要屏蔽的就不走程序,直接return. 不知道对你是否有帮助
熙风 2011-11-17
  • 打赏
  • 举报
回复
 #region 键盘钩子
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook = 0;
public const int WH_KEYBOARD_LL = 13;

public int startindex = -1;



//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
HookProc KeyBoardHookProcedure;

//键盘Hook结构函数
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
#region DllImport
//设置钩子
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
//抽掉钩子
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll")]
//调用下一个钩子
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();

[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);

public void Hook_Start()
{
// 安装键盘钩子
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);

//hHook = SetWindowsHookEx(2,
// KeyBoardHookProcedure,
// GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());

hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);

//如果设置钩子失败.
if (hHook == 0)
{
Hook_Clear();
//throw new Exception("设置Hook失败!");
}
}
}

//取消钩子事件
public void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
//如果去掉钩子失败.
if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
}


public int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
if (kbh.vkCode == 32) //空格
{
int estrat = 0;
int eend = 0;
int etype = -1; //简单元素类型:0选择类,1是输入框,2是诊断类
if (richTextBox1.ReadOnly == false)
{
int inde = 0;
try
{
inde = richTextBox1.SelectionStart;
}
catch (Exception)
{

inde = 0;
Hook_Clear();
}
if (isInSelectElement(pageText, inde, ref estrat, ref eend, ref etype) == true && (etype == 0 || etype == 2))//在选择类型的简单元素中
{
startindex = richTextBox1.SelectionStart;
OnDoubleClick(null, null); //在选择元素中空白时 效果等于双击
//

}
else
{
Hook_Clear();
}


}
return 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}

#endregion

110,536

社区成员

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

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

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