要解决的是一个关于C#全局钩子的问题,问题解决财富值可以再追加,谢谢

问题是这样的,我用C#开发了一个窗体程序,现在我想让窗体最小化没有焦点的情况下,我按键盘的快捷键依然可以触发我指定的事件。由于全局钩子我不会写,因此我在CSDN(http... 问题是这样的,我用C#开发了一个窗体程序,现在我想让窗体最小化没有焦点的情况下,我按键盘的快捷键依然可以触发我指定的事件。 由于全局钩子我不会写,因此我在CSDN(http://bbs.csdn.net/topics/210061046)找了现成的代码,我复制过来然后编译运行测试,全局钩子是可以用的,但是有存在一些问题 代码检测的是用户是否按了Ctrl+S,如果检测到按了Ctrl+S那么久弹出一个对话框,那么我用这个现成的代码测试,谁让测试成功了,但是当我按完Ctrl+S后谁让弹出了对话还,但是我用鼠标一定对话框却一定不了(感觉卡死了一样),等了估计3秒之后,这个弹出的对话框才能移动和关闭。 那么我想让大家帮我解决的问题就是→怎么让弹出的对话框不卡死Form4窗体中的代码
if (hHook == 0)
{
Hook_Clear();
//throw new Exception("设置Hook失败!");
}
}
}
展开
 我来答
玩转数据处理
2016-05-19 · 数据处理,Python,dotnet
玩转数据处理
采纳数:1613 获赞数:3794

向TA提问 私信TA
展开全部

可以试试,项目裏面新增一个窗体(自定义消息框),然後看下面代码:

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.Diagnostics;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //委托 
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
        static int hHook = 0;
        public const int WH_KEYBOARD_LL = 13;
        //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);
        #endregion
        #region 自定义事件
        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 static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
                if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control)  // 截获F8 
                {
                    //MessageBox.Show("快捷键已拦截!不能保存!");
                    Form2 form = new Form2();
                    form.TopMost = true;
                    form.Activate();
                    form.Show();
                    return 1;
                }
                if (kbh.vkCode == (int)Keys.Y
                   && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)  //截获Ctrl+Alt+Y 
                {
                    //MessageBox.Show("不能全部保存!"); 
                    return 1;
                }
                if (kbh.vkCode == (int)Keys.X)
                {
                    //MessageBox.Show("不能全部保存!");
                    Form2 form = new Form2();
                    form.TopMost = true;
                    form.Activate();
                    form.Show();
                    return 1;
                }
            }
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }
        #endregion
        private void button1_Click(object sender, EventArgs e)
        {
            Hook_Start();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Hook_Clear();
        }
    }
}
一了如的本6776
2016-05-19 · TA获得超过162个赞
知道答主
回答量:439
采纳率:0%
帮助的人:71.2万
展开全部
我不懂C#其他语言还可以
追问
谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式