CINZY-LAB

分享免费、实用软件 | 分享编程经验、例程
16

一说到消息钩子大家就会想到dll文件,但这个程序不用DLL文件即可实现全局键盘消息钩子

可以去主页下载DEMO

一共发布3个文件,main.cpp ,main.h,main,rc没有发布的有favicon.ico,resource.h 前者图标自行替换,后者编译器自己构建


main.cpp

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  1. #include "main.h"
  2. #include <windows.h>
  3.  
  4. //--------------------全局变量区---------------------------
  5. #define APPNAME "CINZY_HOOK"
  6. LPCTSTR lpszAppName = APPNAME ;
  7. HINSTANCE ghInstance ;
  8. HWND ghDlg;
  9.  
  10. //--------------------WndProc函数---------------------------
  11. LRESULT __stdcall WndProc (HWND hDlg,UINT iMsg,WPARAM wParam,LPARAM lParam)
  12. {
  13. LRESULT lResult;
  14. BOOL fCallDefProc = FALSE ;
  15. switch ( iMsg )
  16. {
  17. case WM_INITDIALOG:
  18. EnableWindow(GetDlgItem(hDlg,IDC_EDIT1),false);
  19. break;
  20. case WM_COMMAND:
  21. switch ( LOWORD(wParam) )
  22. {
  23. case IDC_BUTTON1:
  24. ShellExecute(NULL, "open", "http://cinzy.com/#DemoKbdHook", NULL, NULL, SW_SHOWNORMAL);
  25. break;
  26. }
  27. break;
  28. case WM_CLOSE:
  29. PostMessage ( hDlg, WM_DESTROY, 0, 0 ) ;
  30. break;
  31. case WM_DESTROY:
  32. PostQuitMessage( 0 ) ;
  33. break ;
  34.  
  35. default:
  36. fCallDefProc = TRUE ;
  37. break ;
  38. }
  39.  
  40. if ( fCallDefProc )
  41. {
  42. lResult = DefWindowProc ( hDlg, iMsg, wParam, lParam ) ;
  43. }
  44. return lResult ;
  45. }
  46.  
  47. DWORD g_main_tid = 0;
  48. HHOOK g_kb_hook = 0;
  49.  
  50. bool CALLBACK con_handler (DWORD)
  51. {
  52. PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);
  53. return TRUE;
  54. };
  55.  
  56. LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)
  57. {
  58. char buf[256];
  59. static char buff[65535]="";
  60. PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
  61. const char *info = NULL;
  62. if (w == WM_KEYDOWN||w == WM_SYSKEYDOWN)
  63. {
  64. sprintf (buf,"%C",p->vkCode);
  65. if(strlen(buff)<65533)
  66. strcat(buff,buf);
  67. SendDlgItemMessage(ghDlg,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)buff);
  68. }
  69.  
  70. return CallNextHookEx (g_kb_hook, code, w, l);
  71. };
  72.  
  73. int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
  74. {
  75. WNDCLASS wc ;
  76. ghInstance=hInstance;
  77. wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  78. wc.lpfnWndProc = (WNDPROC)WndProc ;
  79. wc.cbClsExtra = 0 ;
  80. wc.cbWndExtra = DLGWINDOWEXTRA ;
  81. wc.hInstance = hInstance ;
  82. wc.hIcon = LoadIcon(ghInstance,MAKEINTRESOURCE(IDI_ICON2));
  83. wc.hCursor = LoadCursor(NULL, IDC_ARROW) ;
  84. wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1) ;
  85. wc.lpszMenuName = NULL ;
  86. wc.lpszClassName = lpszAppName ;
  87. if ( IS_WIN95 ){}else if ( !RegisterClass(&wc)){return FALSE;}
  88.  
  89. ghDlg = CreateDialog(hInstance, (LPCTSTR)MAIN_FRAME, 0, (DLGPROC)WndProc);
  90.  
  91. g_main_tid = GetCurrentThreadId ();
  92. SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&con_handler, TRUE);
  93. g_kb_hook = SetWindowsHookEx (
  94. WH_KEYBOARD_LL,
  95. (HOOKPROC)&kb_proc,
  96. GetModuleHandle (NULL),
  97. 0);
  98. if (g_kb_hook == NULL)
  99. {
  100. fprintf (stderr,
  101. "SetWindowsHookEx failed with error %d\n",
  102. ::GetLastError ());
  103. return 0;
  104. };
  105. MSG msg;
  106. while (GetMessage (&msg, NULL, 0, 0))
  107. {
  108. TranslateMessage (&msg);
  109. DispatchMessage (&msg);
  110. };
  111. UnhookWindowsHookEx (g_kb_hook);
  112. return 0;
  113. }

main.h

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  1. #define _WIN32_WINNT 0x400
  2. #ifndef _WINDOWS_
  3. #include
  4. #endif
  5. #include "resource.h"
  6. #if defined (WIN32)
  7. #define IS_WIN32 TRUE
  8. #else
  9. #define IS_WIN32 FALSE
  10. #endif
  11. #define IS_NT IS_WIN32 && (BOOL)(GetVersion() < 0x80000000)
  12. #define IS_WIN32S IS_WIN32 && (BOOL)(!(IS_NT) && (LOBYTE(LOWORD(GetVersion()))<4))
  13. #define IS_WIN95 (BOOL)(!(IS_NT) && !(IS_WIN32S)) && IS_WIN32

main.rc

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114
  115. 115
  116. 116
  117. 117
  118. 118
  119. 119
  1. //Microsoft Developer Studio generated resource script.
  2. //
  3. #include "resource.h"
  4.  
  5. #define APSTUDIO_READONLY_SYMBOLS
  6. /////////////////////////////////////////////////////////////////////////////
  7. //
  8. // Generated from the TEXTINCLUDE 2 resource.
  9. //
  10. #include "afxres.h"
  11.  
  12. /////////////////////////////////////////////////////////////////////////////
  13. #undef APSTUDIO_READONLY_SYMBOLS
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16. // Japanese resources
  17.  
  18. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
  19. #ifdef _WIN32
  20. LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
  21. #pragma code_page(932)
  22. #endif //_WIN32
  23.  
  24. #ifdef APSTUDIO_INVOKED
  25. /////////////////////////////////////////////////////////////////////////////
  26. //
  27. // TEXTINCLUDE
  28. //
  29.  
  30. 1 TEXTINCLUDE DISCARDABLE
  31. BEGIN
  32. "resource.h"
  33. END
  34.  
  35. 2 TEXTINCLUDE DISCARDABLE
  36. BEGIN
  37. "#include ""afxres.h""\r\n"
  38. ""
  39. END
  40.  
  41. 3 TEXTINCLUDE DISCARDABLE
  42. BEGIN
  43. "\r\n"
  44. ""
  45. END
  46.  
  47. #endif // APSTUDIO_INVOKED
  48.  
  49. #endif // Japanese resources
  50. /////////////////////////////////////////////////////////////////////////////
  51.  
  52. /////////////////////////////////////////////////////////////////////////////
  53. // Chinese (中国) resources
  54.  
  55. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
  56. #ifdef _WIN32
  57. LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
  58. #pragma code_page(936)
  59. #endif //_WIN32
  60.  
  61. /////////////////////////////////////////////////////////////////////////////
  62. //
  63. // Dialog
  64. //
  65.  
  66. MAIN_FRAME DIALOGEX 0, 0, 219, 110
  67. STYLE DS_SYSMODAL | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE |
  68. WS_CAPTION | WS_SYSMENU
  69. EXSTYLE WS_EX_ACCEPTFILES
  70. CAPTION "低级键盘钩子演示(DEMO)CINZY-LAB"
  71. CLASS "CINZY_HOOK"
  72. FONT 9, "宋体"
  73. BEGIN
  74. EDITTEXT IDC_EDIT1,0,0,219,86,ES_MULTILINE | ES_READONLY
  75. PUSHBUTTON "主页",IDC_BUTTON1,5,91,50,14
  76. END
  77.  
  78. /////////////////////////////////////////////////////////////////////////////
  79. //
  80. // 24
  81. //
  82.  
  83. 1 24 MOVEABLE PURE "XPStyle.manifest"
  84.  
  85. /////////////////////////////////////////////////////////////////////////////
  86. //
  87. // Icon
  88. //
  89.  
  90. // Icon with lowest ID value placed first to ensure application icon
  91. // remains consistent on all systems.
  92. IDI_ICON2 ICON DISCARDABLE "favicon.ico"
  93.  
  94. /////////////////////////////////////////////////////////////////////////////
  95. //
  96. // DESIGNINFO
  97. //
  98.  
  99. #ifdef APSTUDIO_INVOKED
  100. GUIDELINES DESIGNINFO DISCARDABLE
  101. BEGIN
  102. MAIN_FRAME, DIALOG
  103. BEGIN
  104. BOTTOMMARGIN, 109
  105. END
  106. END
  107. #endif // APSTUDIO_INVOKED
  108.  
  109. #endif // Chinese (中国) resources
  110. /////////////////////////////////////////////////////////////////////////////
  111.  
  112. #ifndef APSTUDIO_INVOKED
  113. /////////////////////////////////////////////////////////////////////////////
  114. //
  115. // Generated from the TEXTINCLUDE 3 resource.
  116. //
  117.  
  118. /////////////////////////////////////////////////////////////////////////////
  119. #endif // not APSTUDIO_INVOKED
推荐(0)
收藏

随机本博客日志

您必须登录 才能进行评论。