我最近使用Visual Studio 2010在Visual C#.NET 2010中创建了一个程序作为Windows窗体应用程序。该程序通过user32.dll函数“RegisterHotkey”使用全局热键。 一切都很好。 当按下注册的热键时,我能够显示MessageBox(例如)。 然后,今天,在Visual Studio中出现一些奇怪的错误(与Hotkey无关)(事实上它只是一个未加载的图像),RegisterHotkey函数不再起作用。
我没有更改热键代码中的任何内容。
当我在Visual Studio中调试时,我没有例外。 通过断点,我发现代码在RegisterHotkey函数处停止了。 当我从项目的“debug”文件夹中执行.exe文件时,程序显示一条错误,指出在“user32”DLL中找不到“入口点”RegisterHotkey“。
这很奇怪,因为它一直有效。
为了检查我的项目或代码是否是原因,我创建了一个新的Windows窗体应用程序并输入了代码:
using System.Runtime.InteropServices;
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int RegisterHotkey(IntPtr Hwnd, int ID, int Modifiers, int Key);
[DllImport("kernel32", EntryPoint = "GlobalAddAtomA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern short GlobalAddAtom(string IDString);
private void Form1_Load(object sender, EventArgs e)
{
int atomid = GlobalAddAtom("hallo");
RegisterHotkey(this.Handle, atomid, 0, (int)Keys.A);
}
}
}
哪个产生了同样的错误。尝试调用RegisterHotkey函数时发生错误。我这次尝试输入的代码量最少。
表单没有控件,所有它都应该在Load事件中注册一个热键。
我的问题是: 任何人都可以告诉我为什么RegisterHotkey不再被发现了? 我在任何地方都犯了错误吗? 我能做些什么才能让它再次发挥作用?
我尝试导入“user32.dll”而不是“user32”,但除了错误消息中的文本外,它没有更改任何内容。在那里,“user32”被“user32.dll”取代。
编辑:我不知道它是否相关,但我使用的是Windows 7 Professional 64位版本和.NET framework 4.0(不是客户端配置文件)答案 0 :(得分:2)
可能是因为函数名称为RegisterHotKey
,大写 K ,而不是RegisterHotkey
。
尝试完全按照pinvoke.net:
中的描述进行声明[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);