小弟用c#做了一个注册全局热键的程序,调用了api。为了方便,把用户每次注册的热键都用xml保存下来,下次启动时当用户登录后就自动从xml中读取之前注册的热键。现在问题是,用户新建热键后,使用正常,如按ctrl+N 可以打开新窗口,但是当下次软件启动时,我程序中也是一样的注册热键,但却不能用。每次都得重新注册快捷键。
诡异的是,这个程序我在本地调试完全正常,就是我在本机上运行一切正常,但是在别的电脑就不能根据读取的xml信息注册热键。主要代码如下:public Form1()
        {
            InitializeComponent();
            handle = Handle;
            
            if (Login() == true)
            {
                LoadXML();
            }            
            //HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Ctrl, Keys.D);
        如果把这句放在这里就运行正常,但是放在下面函数中就无法注册成功
}
public void LoadXML()
        {
            XElement rootNode = XElement.Load("hotkey.xml");
            ....
            HotKey.RegisterHotKey(Form1.handle, id, DicKeys[id].Mod, DicKeys[id].Key);
//这里程序运行没报错,但在别的电脑上热键就是无法注册成功
//这个RegisterHotKey方法验证过是没有问题的
        }请教各位高手~~

解决方案 »

  1.   

    注意热键的key是全局唯一的,否则会出错。
      

  2.   


    谢谢,是全局唯一的,因为用户新建热键是可以使用的,就是软件关闭后,重启读取上次热键时,LoadXML()函数中注册就不行,而在form()构造函数中注册才可以,不知道为什么
      

  3.   

    虽然你这注册语句我没看懂,但是我看了一眼就觉得是if语句的问题,可能LoadXML()方法根本没运行。
      

  4.   

    还有id, DicKeys[id]这两个变量怎么声明和赋值的你应该发出来看看
      

  5.   


    谢谢,我的调试过的,LoadXML()以及之中的RegisterHotKey都运行了,我后面设置了返回值,为false,但是放在form()构造函数注册就返回true
      

  6.   


    注册返回值是false,但在本机电脑上返回true。
    也就是说,在我这台电脑一切正常,换一台电脑后,就只能在构造函数注册才能成功,放在loadxml()里就返回false、、、
    好诡异啊
      

  7.   

    真是见鬼了,我写如下代码
    bool thi = HotKey.RegisterHotKey(handle, id, DicKeys[id].Mod, DicKeys[id].Key);//这句调试中居然看不到变量thi,vs2012调试环境中显示无thi 变量,但其实这句代码已经执行过了,本地上已经注册热键成功                    
                        int ddd = id++;//这里设置的这句也执行了,看得到ddd变量值
     int ddd2 = id++;//这里设置的断点
      

  8.   

    你发布hotkey.xml这个文件有发布过去吗?
    在工程里看这个文件的属性。
    复制到输出目录选择“始终复制”
    生成操作那里选择“内容”
      

  9.   

    多谢各位,自己解决了,好像是因为子线程注册不行,得切换到主线程执行就好。
    我把函数调用LoadXML()修改成this.Invoke(new MyThreadRegister(()=>LoadXML()));
    解决了
      

  10.   


    这是不是叫委托呢?是委托,不过这不是关键,关键是要切换到主线程中执行注册热键方法才行,直接在子线程中执行LoadXML不行。