(关于注册系统热键的问题)几乎同样的代码,效果却不一样

koflfy 2009-06-16 09:51:55
网上找了一段代码,测试正常,但加在我自己的程序里就无效,郁闷死我了。。。。。麻烦大家看看。


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

namespace 测试热键
{
public partial class Form1 : Form
{
[DllImport("user32")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);
//注册热键的api
[DllImport("user32")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8
}

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Clipboard.Clear();//先清空剪贴板防止剪贴板里面先复制了其他内容


//注册热键(窗体句柄,热键ID,辅助键,实键)
RegisterHotKey(Handle, 100, 2, Keys.F10);// 热键:Control +F10
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
//注消热键(句柄,热键ID)
UnregisterHotKey(Handle, 100);
}

protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;//按快捷键
switch (m.Msg)
{
case WM_HOTKEY:
ProcessHotkey(m);//调用主处理程序
break;
}
base.WndProc(ref m);


}

void ProcessHotkey(Message m)
{
//这里是处理快捷键的地方,为空就好了
IntPtr id = m.WParam; //IntPtr用于表示指针或句柄的平台特定类型
string sid = id.ToString();
switch (sid)
{
case "100": DecreseVolumnb();
break;
}

}

void DecreseVolumnb()
{
MessageBox.Show("test");
}
}
}




这段代码正常,按CTRL+F10可以弹出一个test的对话框。
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2009-06-16
  • 打赏
  • 举报
回复

private void Form1_Load(object sender, EventArgs e)
{

Clipboard.Clear();//先清空剪贴板防止剪贴板里面先复制了其他内容


//注册热键(窗体句柄,热键ID,辅助键,实键)
RegisterHotKey(Handle, 100, 2, Keys.F10);// 热键:Control +F10
MessageBox.Show("handle = " + this.Handle.ToInt32() ); //<---


if (this.Visible == true)
{
this.Hide();
this.ShowInTaskbar = false; //<---
MessageBox.Show("handle = " + this.Handle.ToInt32() ); //<---
}
else
{
this.Visible = true;
this.ShowInTaskbar = true; //<---
MessageBox.Show("handle = " + this.Handle.ToInt32() ); //<---
this.WindowState = FormWindowState.Normal;
this.BringToFront();
}

}


建议你测试一下如上代码,看this.Handle是否发生了改变。

.Net的控件的Handle并不是一成不变的,当改变窗口风格的时候(试试this.ShowInTaskbar),.Net会重新创建一个窗口。
你用旧的Handle订阅Windows消息,你窗口Handle改变了,当然就收不到通知了。

ztenv 2009-06-16
  • 打赏
  • 举报
回复
RegisterHotKey()函数返回bool值
koflfy 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lianshaohua 的回复:]
1、判断一下有没有注册成功
2、换个热键
3、换个热键的ID(你那个100换成其它的数字)
[/Quote]

第2跟第3我都测试过了,但还是不管用,第1个请问如何判断注册成功没有啊?
ztenv 2009-06-16
  • 打赏
  • 举报
回复
1、判断一下有没有注册成功
2、换个热键
3、换个热键的ID(你那个100换成其它的数字)
koflfy 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Linux7985 的回复:]
看看是不是冲突了,换个没用的热键注册一下
[/Quote]

肯定不是冲突问题,第一个程序运行就没事。。而且我换过几个热键。。
烈火蜓蜻 2009-06-16
  • 打赏
  • 举报
回复
看看是不是冲突了,换个没用的热键注册一下
koflfy 2009-06-16
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;

namespace test
{
public partial class Form1 : Form
{
public static string address = System.Environment.CurrentDirectory;
private bool windowCreate=true;

[DllImport("user32")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);
//注册热键的api
[DllImport("user32")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8
}



public Form1()
{

InitializeComponent();
//RegisterHotKey(Handle, 100, 2, Keys.F10); // 热键:Control +F10
}


private void Form1_Load(object sender, EventArgs e)
{

Clipboard.Clear();//先清空剪贴板防止剪贴板里面先复制了其他内容


//注册热键(窗体句柄,热键ID,辅助键,实键)
RegisterHotKey(Handle, 100, 2, Keys.F10);// 热键:Control +F10

if (this.Visible == true)
{
this.Hide();
this.ShowInTaskbar = false;
}
else
{
this.Visible = true;
this.ShowInTaskbar = true;
this.WindowState = FormWindowState.Normal;
//this.Show();
this.BringToFront();
}

}



protected override void OnActivated(EventArgs e)
{
if (windowCreate)
{
base.Visible = false;
windowCreate = false;
}

base.OnActivated(e);
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
//注消热键(句柄,热键ID)
UnregisterHotKey(Handle, 100);

}

protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;//按快捷键
switch (m.Msg)
{
case WM_HOTKEY:
ProcessHotkey(m);//调用主处理程序
break;
}
base.WndProc(ref m);


}

void ProcessHotkey(Message m)
{
//这里是处理快捷键的地方,为空就好了
IntPtr id = m.WParam; //IntPtr用于表示指针或句柄的平台特定类型
  string sid = id.ToString();
switch (sid)
{
case "100": DecreseVolumnb();
break;
}

}

void DecreseVolumnb()
{
//notifyIcon1.Visible = false;
MessageBox.Show("test");
}

}
}

这段代码调试通过,但按下CTRL+F10却没有弹出test的对话框窗口,由于这里我用到
notifyIcon,一运行程序的时候会最小化到托盘图标,请问是不是这个原因才使程序没有响应啊。。。
koflfy 2009-06-16
  • 打赏
  • 举报
回复
谢谢!!!!终于搞定了。。。谢谢楼上的哥们。。。
gomoku 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 koflfy 的回复:]
楼上的,我测试了一下,果然this.Handle发生了改变,句柄每次都不一样,那请问一下,我想实现在按下CTRL+F10的时候,notifyIcon1.Visible=true,要如何才能达到目的呢,请指点一下思路?难道要用findwindow?
[/Quote]

先设定this.ShowInTaskbar再注册不就可以了?
koflfy 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lianshaohua 的回复:]
RegisterHotKey()函数返回bool值
[/Quote]

谢谢,我测试过,已经注册成功了。
koflfy 2009-06-16
  • 打赏
  • 举报
回复
楼上的,我测试了一下,果然this.Handle发生了改变,句柄每次都不一样,那请问一下,我想实现在按下CTRL+F10的时候,notifyIcon1.Visible=true,要如何才能达到目的呢,请指点一下思路?难道要用findwindow?

110,533

社区成员

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

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

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