翻天伏地求助WPF 全局热键实现呀。。。

Athenaeum 2008-12-08 07:01:11
winform中实现了,
拿到WPF中却不行了,
怀疑有个地方用windows.form 获得键盘消息来实现的,
可能是这的问题,有谁做过呀??
...全文
483 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kala_yue 2011-08-03
  • 打赏
  • 举报
回复
WPF 注册热键 http://www.cnblogs.com/alvinyue/archive/2011/08/03/2126022.html
龙宜坡 2009-07-15
  • 打赏
  • 举报
回复
"翻天伏地"


超维电脑科技 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lorenliu 的回复:]
需要调用API

[DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate callbackPtr, IntPtr hInstance, uint dwThreadId);

        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref KBHookStruct lParam);


可以参考http://www.codeproject.com/KB/WPF/ShapeShow.aspx
[/Quote]
UP
li45214521 2009-07-11
  • 打赏
  • 举报
回复
LZ 可以试试这个ComponentDispatcher静态类
kissyou886 2009-07-10
  • 打赏
  • 举报
回复
首先要知道Widndow类里没有 WndProc 函数了,想要截取 Windows 消息必须借助 HwndSource 添加 Hook。
给说下,我的简单实现方法,便于入门学习。
1.通过RegisterHotKey注册全局热键;
2.借助 HwndSource 添加 Hook,建议与RegisterHotKey一起在继承的OnSourceInitialized里实现;
3.再使用自己定义的WndProc来截取Windows 消息;
4.程序退出时使用UnRegisterHotKey注销热键。

下面代码是简单实现的一个Esc全局热键:

[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, System.Windows.Forms.Keys keys);
[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

public static int WM_HOTKEY = 0x0312;
public Window1()
{
InitializeComponent();
this.Closed+=new EventHandler(Window1_Closed);
}
void Window1_Closed(object sender, EventArgs e)
{
IntPtr hWnd = new WindowInteropHelper(this).Handle;
UnregisterHotKey(hWnd, 123);
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
IntPtr hWnd = new WindowInteropHelper(this).Handle;
RegisterHotKey(hWnd, 123, 0, System.Windows.Forms.Keys.Escape);

HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
source.AddHook(WndProc);
}

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_HOTKEY)
{
if (wParam.ToInt32() == 123)
{
MessageBox.Show("OK");
handled=true;
}
}
return IntPtr.Zero;
}
zanezeng_GC 2009-07-09
  • 打赏
  • 举报
回复
http://www.cnblogs.com/zengezenge/archive/2009/07/09/1519582.html
WizCas 2008-12-22
  • 打赏
  • 举报
回复
mark
LorenLiu 2008-12-09
  • 打赏
  • 举报
回复
需要调用API

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate callbackPtr, IntPtr hInstance, uint dwThreadId);

[DllImport("user32.dll", SetLastError = true)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref KBHookStruct lParam);


可以参考http://www.codeproject.com/KB/WPF/ShapeShow.aspx
Foxer 2008-12-08
  • 打赏
  • 举报
回复
方法一:用Command实现,在主窗口上定义一个Command,并添加热键
方法二:用EventManager.RegisterRoutedEvent绑定按键事件

别的还没想到,暂时就这些 :)
Foxer 2008-12-08
  • 打赏
  • 举报
回复
点数太少 ^_^
Athenaeum 2008-12-08
  • 打赏
  • 举报
回复
自己顶
leo_bogard 2008-12-08
  • 打赏
  • 举报
回复
up

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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