C#注册控件处理程序(SetConsoleCtrlHandler)函数示例的详细介绍


本文摘自PHP中文网,作者黄舟,侵删。

添加或删除应用程序定义的HandlerRoutine从调用进程的处理函数列表功能。

Win32 API
功能:
添加或删除应用程序定义的HandlerRoutine从调用进程的处理函数列表功能。
函数原型:

1

2

3

4

BOOL SetConsoleCtrlHandler(

PHANDLER_ROUTINE HandlerRoutine, // 回调函数

BOOL Add // 表示添加还是删除

);

返回值:BOOL类型
参数
参数HandlerRoutine:一个应用程序定义的指针HandlerRoutine 功能要添加或删除。 这个参数可以是NULL。
参数Add:如果此参数为TRUE,处理程序添加,如果是假的,该处理程序将被删除。
返回值:
如果函数失败,返回值为0.否则,返回一个非0值。 若想获得更多错误信息,调用GetLastError函数 。
说白了,就是一个系统调用。
第一个参数是函数指针,就是上面的那个函数。第二个参数是标志,如果为TRUE那么就安装钩子,如果为FALSE那么删除钩子。

利用Windows API 拦截Console的手动关闭事件的消息,来实现,下面我给出的是一个完整的事例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

using System;

using System.Collections.Generic;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading;

 

/************************************************************************/

/* CSharp控制台关闭事件改写

 * Powered by:testcs_dn

 * Blog:http://www.php.cn/

 */

/************************************************************************/

namespace CSharp控制台关闭事件改写

{

    /// <summary>

    /// 控制台关闭事件改写

    /// 这里展示了Windows API SetConsoleCtrlHandler函数的应用,同时展示了线程计时器的使用;

    /// Author:testcs_dn

    /// Date:2015-01-03

    /// </summary>

    class Program

    {

        /// <summary>

        /// 计时器回调函数,在这里处理计时时间是否到达的判断以及要做的事情;

        /// </summary>

        /// <param name="obj"></param>

        public static void workOvertimeTimerCallback(object obj)

        {

            DateTime dt = DateTime.Now;

            if (dt.Hour == 16 && dt.Minute > 0)

            {

                Console.WriteLine("ok");

            }

        }

 

        //计时器变量

        public static System.Threading.Timer workOvertimeTimer = null;

 

        //定义处理程序委托

        delegate bool ConsoleCtrlDelegate(int dwCtrlType);

 

        const int CTRL_CLOSE_EVENT = 2;

 

        //导入SetCtrlHandlerHandler API

        [DllImport("kernel32.dll")]

        private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);

        static void Main(string[] args)

        {

            ConsoleCtrlDelegate newDelegate = new ConsoleCtrlDelegate(HandlerRoutine);

            if (SetConsoleCtrlHandler(newDelegate, true))

            {

                //初始化计时器

                workOvertimeTimer = new System.Threading.Timer(new TimerCallback(workOvertimeTimerCallback), null, 1000, 10000);

                //这里执行你自己的任务,我举例输出“...”,为了展示长时间的任务,我用了一个死循环;

                //避免输出太多,使用了Sleep;

                //注意:Sleep的时间不可太长,否则可能影响Console.ReadKey(),导致不能接收用户输入;

                while (true)

                {

                    Console.WriteLine("...");

                    Thread.Sleep(100);

                }

            }

            else

            {

                Console.WriteLine("抱歉,API注入失败,按任意键退出!");

                Console.ReadKey();

            }

        }

 

        /// <summary>

        /// 处理程序例程,在这里编写对指定事件的处理程序代码

        /// </summary>

        /// <param name="CtrlType"></param>

        /// <returns></returns>

        static bool HandlerRoutine(int CtrlType)

        {

            switch (CtrlType)

            {

                case CTRL_CLOSE_EVENT:       //用户要关闭Console了

                    Console.WriteLine();

                    Console.WriteLine("任务还没有完成,确认要退出吗?(Y/N)");

                    ConsoleKeyInfo ki = Console.ReadKey();

                    return ki.Key == ConsoleKey.Y;

                default:

                    return true;

            }

        }

    }

}

以上就是C#注册控件处理程序(SetConsoleCtrlHandler)函数示例的详细介绍的详细内容!

相关阅读 >>

C#字符串处理小工具的详细介绍

C#设计模式-观察者模式的另类的示例代码总结

formdragger在C#中实现窗体拖拽器的方法详解

C#在pdf中创建和填充域的详细介绍(图文)

C# tabcontrol组件如何切换显示form窗体的示例代码

具体介绍C#将指定网页添加到收藏夹的方法

详解C#多线程之线程同步(图文)

详情介绍C#中winform实现多线程异步更新ui的示例代码

C#通过oledb操作excel实例代码

C#中的数据类型是什么?C#中的四种数据类型解释

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...