#include <windows.h>LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if(lParam>>31 == 1)
         {
switch(wParam)
{
case VK_ESCAPE:
return 1;
break;
}
         }
}LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("HelloWin") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     hwnd = CreateWindow (szAppName,                  // window class name
                          TEXT ("The Hello Program"), // window caption
                          WS_OVERLAPPEDWINDOW,        // window style
                          CW_USEDEFAULT,              // initial x position
                          CW_USEDEFAULT,              // initial y position
                          CW_USEDEFAULT,              // initial x size
                          CW_USEDEFAULT,              // initial y size
                          NULL,                       // parent window handle
                          NULL,                       // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                     // creation parameters
     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
   
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
     
     switch (message)
     {
     case WM_CREATE:
          SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, ::AfxGetApp()->m_nThreadID); 
         return 0 ;     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
          
          GetClientRect (hwnd, &rect) ;
          
          DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
          EndPaint (hwnd, &ps) ;
          return 0 ;
          
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}
今天CSDN不认回车,你自己整理一下吧;

解决方案 »

  1.   

    \temp\test.cpp(57) : error C2039: 'AfxGetApp' : is not a member of '`global namespace''
    \temp\test.cpp(57) : error C2065: 'AfxGetApp' : undeclared identifier
    \temp\test.cpp(57) : error C2227: left of '->m_nThreadID' must point to class/struct/union
    Error executing cl.exe.
    然后我用afxwin.h替换掉windows.h,可以编译了,但运行出错!
      

  2.   

    不要包含<afxwin.h>文件#include <windows.h>HOOKPROC g_hHookOld = NULL;LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
    {
    if (code == HC_ACTION)
    {
    if (lParam>>31 == 1)
    {
    switch(wParam)
    {
    case VK_ESCAPE:
    return 1;
    break;
    }
    }
    }

    return CallNextHookEx ((HHOOK)g_hHoolOld, nCode, wParam, lParam);
    }
    在 WndProc 中替换WM_CREATE: 为
    case WM_CREATE:
         g_hHookOld = (HOOKPROC)SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadID ());
         return 0 ;
      

  3.   

    c:\temp\test.cpp(20) : error C2065: 'g_hHoolOld' : undeclared identifier
    c:\temp\test.cpp(20) : error C2065: 'nCode' : undeclared identifier
    c:\temp\test.cpp(71) : error C2065: 'GetCurrentThreadID' : undeclared identifier
    Error executing cl.exe.temp.exe - 3 error(s), 0 warning(s)还是有问题~~~~~~~~~:(
      

  4.   

    c:\temp\test.cpp(20) : error C2065: 'g_hHoolOld' : undeclared identifier
    c:\temp\test.cpp(20) : error C2065: 'nCode' : undeclared identifier
    c:\temp\test.cpp(71) : error C2065: 'GetCurrentThreadID' : undeclared identifier
    Error executing cl.exe.g_hHoolOld 改为 g_hHookOld
    nCode      改为 code
    GetCurrentThreadID  改为 GetCurrentThreadId肯定不会再有问题了,而却可以运行
      

  5.   

    to:yongin() 
    行了。不过键盘输入被存到哪个变量里去了呢?
    怎么取得键盘输入呢?比如把输入的字符显示到窗口上或存进一个文本文件。
      

  6.   

    to:yongin() 
    行了。不过键盘输入被存到哪个变量里去了呢?
    怎么取得键盘输入呢?比如把输入的字符显示到窗口上或存进一个文本文件。
      

  7.   

    KeyboardProc 中的参数 wParam 就是你要得到的键盘输入,比如VK_ESCAPE就是Esc键, VK_G就是G键等等。你可以在KeyboardProc中的switch 语句中写入你自己的功能
      

  8.   

    ??这个不是跟WM_KEYDOWN一样了吗???
      

  9.   

    不止,WM_KEYDOWN 只对一个窗口有效,HOOK 对整个线程有效,如果你想截获整个进程的键盘消息,还可以这样做:g_hHookOld = (HOOKPROC)SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInst, 0);这里的 hInst 可以从WinMain中得到(例子中的hInstance).甚至可以截获整个操作系统的键盘输入。
      

  10.   

    不止,WM_KEYDOWN 只能响应一个窗口的消息。HOOK 后可以响应整个线程的键盘输入,如果HOOK时这样调用:g_hHookOld = (HOOKPROC)SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInst, 0);则可以截获整个进程的键盘输入。这里hInst是WinMain中的参数hInstance.甚至可以截获整个系统的键盘输入。
      

  11.   

    还有一个问题,在消息处理的函数中应该增加这么一句  WM_NCDESTROY:
         UnhookWindowsHookEx (g_hHookOld);
         g_hHookOld = NULL;
         break;
      

  12.   

    to:yongin()
    我需要的是截取整个系统的键盘输入,并显示出来(在窗口或存入文本都可以),用SDK写的,分不是问题,另给100。
    主要是想学习SDK+HOOK函数的用法。非常感谢。
      

  13.   

    1. 创建一个dll project (设名为 kbdhook)
    2. 编写两个export 函数:InstallHook 和 UninstallHook
    3. void _stdcall InstallHook ()
       {
           g_hHookOld = (HOOKPROC)SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInst, 0);
        }
        这里hInst是这个dll的hInstance.4. 创建一个Exe, 装入前面创建的dll.
    5. 保持4中的EXE运行,就可以截获所有的键盘输入(我有空的话会写一个简单的例子,你感兴趣的话可以发给你)
      

  14.   

    留个mail地址,明天发给你,我已经做好了一个demo
      

  15.   

    我想请问,这种方法能截获w2000的所有键盘输入吗?比如:CTRL+DEL+ALT
    、ALT+TAB和window快捷键?