#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);
HWND hWndMain;
int iFontSign = 0;int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG Message;
if(! InitWindowsClass(hInstance))
    return FALSE;
if(! InitWindows(hInstance,nCmdShow))
    return FALSE;
while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)
{
HDC hDC;
HFONT hF;
PAINTSTRUCT ps;
BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;
char nUp[]="Up Key Down";
char nShift[]="Shift Key Down";
char nCtrl[]="Ctrl Key Down";
char nCtrlA[]="Ctrl+A Key Down";
char nShiftB[]="Shift+B Key Down";
char chFont[7];
int X=0, Y=0;
HPEN hPen;
HBRUSH hBrush;switch(iMessage)
{
case WM_KEYDOWN:
{
   switch(wParam)
   {
   case VK_UP:
   nUpKeyDown=TRUE;
   break;
   case VK_SHIFT:
   nShiftKeyDown=TRUE;
   break;
   case VK_CONTROL:
   nCtrlKeyDown=TRUE;
   break;
   default:
   break;
   }
}
case WM_KEYUP:
InvalidateRect(hWnd, NULL, FALSE);
break;
case WM_CHAR:
if(wParam==(65&VK_CONTROL))
{
if(nCtrlKeyDown==TRUE)
{
nCtrlAKeyDown=TRUE;
nCtrlKeyDown=FALSE;
}
}
else if(wParam==98||wParam==66)
{
if(nShiftKeyDown==TRUE)
{nShiftBKeyDown=TRUE;
 nShiftKeyDown=FALSE;
}
}
break;
case WM_PAINT:
hDC=BeginPaint(hWnd, &ps);
hPen=(HPEN)GetStockObject(WHITE_PEN);
hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);
strcpy(chFont, "airblk");
SelectObject(hDC, hPen);
SelectObject(hDC, hBrush);
SetTextColor(hDC, RGB(255,0,0));
hF=CreateFont(40,0,0,0,400,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,
                 CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,chFont);
if(nCtrlKeyDown==TRUE && nCtrlAKeyDown==FALSE)
{
Rectangle(hDC,0,0,300,200);
TextOut(hDC,X,Y,nCtrl,strlen(nCtrl));
        nCtrlKeyDown=FALSE;
    
}
    else if(nUpKeyDown==TRUE)
{
Rectangle(hDC,0,0,300,200);
TextOut(hDC,X,Y,nUp,strlen(nUp));
        nUpKeyDown=FALSE;
    
}
    else if(nShiftKeyDown==TRUE && nShiftKeyDown==FALSE)
    {    
Rectangle(hDC,0,0,300,200);
TextOut(hDC,X,Y,nShift,strlen(nShift));
nShiftKeyDown=FALSE;
   
}
    else if(nCtrlAKeyDown==TRUE && nCtrlKeyDown==FALSE)
    {    
Rectangle(hDC,0,0,300,200);
TextOut(hDC,X,Y,nCtrlA,strlen(nCtrlA));
nCtrlAKeyDown=FALSE;
   
}
    else if(nShiftBKeyDown==TRUE && nShiftKeyDown==FALSE)
{   
Rectangle(hDC,0,0,300,200);
TextOut(hDC,X,Y,nShiftB,strlen(nShiftB));
nShiftBKeyDown=FALSE;
   
}
else
{
printf("Input Error\n");

}
DeleteObject(hPen);
DeleteObject(hBrush);
//InvalidateRect(hWnd,NULL,1);
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return(0);
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
return 0;
}
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow("5_5","nKeyDown",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if (! hWnd)
    return FALSE;
hWndMain=hWnd;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}BOOL InitWindowsClass(HINSTANCE hInstance)
{
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName="5_5";
WndClass.lpszMenuName=NULL;
WndClass.style=0;
return RegisterClass(&WndClass);
}程序要求按Up&Ctrl&Ctrl+A&Shift&Shift+B时分别输出
char nUp[]="Up Key Down";
char nShift[]="Shift Key Down";
char nCtrl[]="Ctrl Key Down";
char nCtrlA[]="Ctrl+A Key Down";
char nShiftB[]="Shift+B Key Down";
但程序运行后无任何反应亚

解决方案 »

  1.   

    编译通过,在taskmgr里有吗?先在这里加上MessageBox,if(! InitWindowsClass(hInstance))
       {
             MessageBox();
             return FALSE;
    }
    if(! InitWindows(hInstance,nCmdShow))
       {         MessageBox();
             return FALSE;
    }
    怀疑这里初始化问题,自己仔细看参数
      

  2.   

    1、下面这几个变量要设成全局的
    BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;2、代码有错误
    else if(nShiftKeyDown==TRUE && nShiftKeyDown==FALSE) //这个shift按破也没用。。
    仔细查下吧
      

  3.   

    #include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam);
    BOOL InitWindowsClass(HINSTANCE hInstance);
    BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);
    HWND hWndMain;
    int iFontSign = 0;
    BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    MSG Message;if(! InitWindowsClass(hInstance))
        return FALSE;
    if(! InitWindows(hInstance,nCmdShow))
        return FALSE;
    while(GetMessage(&Message,0,0,0))
    {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
    }
    return Message.wParam;
    }long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)
    {
    HDC hDC;
    HFONT hF;
    PAINTSTRUCT ps;
    BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;
    char nUp[]="Up Key Down";
    char nShift[]="Shift Key Down";
    char nCtrl[]="Ctrl Key Down";
    char nCtrlA[]="Ctrl+A Key Down";
    char nShiftB[]="Shift+B Key Down";
    char chFont[7];
    int X=0, Y=0;
    HPEN hPen;
    HBRUSH hBrush;switch(iMessage)
    {
    case WM_KEYDOWN:
    {
       switch(wParam)
       {
       case VK_UP:
       nUpKeyDown=TRUE;
       break;
       case VK_SHIFT:
       nShiftKeyDown=TRUE;
       break;
       case VK_CONTROL:
       nCtrlKeyDown=TRUE;
       break;
       default:
       break;
       }
    }
    case WM_KEYUP:
    InvalidateRect(hWnd, NULL, FALSE);
    break;
    case WM_CHAR:
    if(wParam==(65&VK_CONTROL))
    {
    if(nCtrlKeyDown==TRUE)
    {
    nCtrlAKeyDown=TRUE;
    nCtrlKeyDown=FALSE;
    }
    }
    else if(wParam==98||wParam==66)
    {
    if(nShiftKeyDown==TRUE)
    {nShiftBKeyDown=TRUE;
     nShiftKeyDown=FALSE;
    }
    }
    break;
    case WM_PAINT:
    hDC=BeginPaint(hWnd, &ps);
    hPen=(HPEN)GetStockObject(WHITE_PEN);
    hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);
    strcpy(chFont, "airblk");
    SelectObject(hDC, hPen);
    SelectObject(hDC, hBrush);
    SetTextColor(hDC, RGB(255,0,0));
    hF=CreateFont(40,0,0,0,400,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,
                     CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,chFont);
    if(nCtrlKeyDown==TRUE && nCtrlAKeyDown==FALSE)
    {
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nCtrl,strlen(nCtrl));
            nCtrlKeyDown=FALSE;
        
    }
        else if(nUpKeyDown==TRUE)
    {
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nUp,strlen(nUp));
            nUpKeyDown=FALSE;
        
    }
        else if(nShiftKeyDown==TRUE && nShiftBKeyDown==FALSE)
        {    
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nShift,strlen(nShift));
    nShiftKeyDown=FALSE;
       
    }
        else if(nCtrlAKeyDown==TRUE)
        {    
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nCtrlA,strlen(nCtrlA));
    nCtrlAKeyDown=FALSE;
    nCtrlKeyDown=FALSE;
       
    }
        else if(nShiftBKeyDown==TRUE)
    {   
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nShiftB,strlen(nShiftB));
    nShiftBKeyDown=FALSE;
    nShiftKeyDown=FALSE;
       
    }
    else
    {
    printf("Input Error\n");

    }
    DeleteObject(hPen);
    DeleteObject(hBrush);
    EndPaint(hWnd,&ps);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return(0);
    default:
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
    }
    return 0;
    }
    BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)
    {
    HWND hWnd;
    hWnd=CreateWindow("5_5","nKeyDown",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
    if (! hWnd)
        return FALSE;
    hWndMain=hWnd;
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
    }BOOL InitWindowsClass(HINSTANCE hInstance)
    {
    WNDCLASS WndClass;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=WndProc;
    WndClass.lpszClassName="5_5";
    WndClass.lpszMenuName=NULL;
    WndClass.style=0;
    return RegisterClass(&WndClass);
    }都尝试过了,还是不行,哪位大虾能救我呀!
      

  4.   

    你在WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)里面要去掉这一行:
    BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;
      

  5.   

    为何把BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;
    放到WndPro外面就可以呢
      

  6.   

    BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;
     前面加static运行也OK
    哪位大虾能指点江山
      

  7.   

    还有程序中应该有功能
    同时按下Ctrl+A, Shift+B时应该有响应
    但程序就是没有反应
      

  8.   

    原来大虾们都是这样的:
    Do be sorrow.
      

  9.   

    关于static:
    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。
    静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。
    在函数体内生成的静态变量它的值也只能维持。
      

  10.   

    帮你改成功了
    自己看下,晓得错在哪里了吧#include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam);
    BOOL InitWindowsClass(HINSTANCE hInstance);
    BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);
    HWND hWndMain;
    int iFontSign = 0;
    BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    MSG Message; if(! InitWindowsClass(hInstance))
    {
    MessageBox(hWndMain, TEXT("InitWindowsClass错误!"),TEXT("ERROR"),MB_OK);
    return FALSE;
    }
    if(! InitWindows(hInstance,nCmdShow))
    {
    MessageBox(hWndMain, TEXT("InitWindows错误!"),TEXT("ERROR"),MB_OK);
    return FALSE;
    }
    while(GetMessage(&Message,0,0,0))
    {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
    }
    return Message.wParam;
    }long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)
    {
    HDC hDC;
    HFONT hF;
    PAINTSTRUCT ps;

    char nUp[]="Up Key Down";
    char nShift[]="Shift Key Down";
    char nCtrl[]="Ctrl Key Down";
    char nCtrlA[]="Ctrl+A Key Down";
    char nShiftB[]="Shift+B Key Down";
    char chFont[7]; /*LPCSTR nUp = "Up Key Down";
    LPCSTR nShift = "Shift Key Down";
    LPCSTR nCtrl   = "Ctrl Key Down";
    LPCSTR nCtrlA = "Ctrl+A Key Down";
    LPCSTR nShiftB = "Shift+B Key Down";*/
    int X=0, Y=0;
    HPEN hPen;
    HBRUSH hBrush; switch(iMessage)
    {
    case WM_KEYDOWN:
    {
       switch(wParam)
       {
       case VK_UP:
       //MessageBox( hWndMain, nUp, TEXT("有键按下"), MB_OK);
       nUpKeyDown=TRUE;
       break;
       case VK_SHIFT:
      // MessageBox( hWndMain, nShift, TEXT("有键按下"), MB_OK);
       nShiftKeyDown=TRUE;
       break;
       case VK_CONTROL:
      // MessageBox( hWndMain, nCtrl, TEXT("有键按下"), MB_OK);
       nCtrlKeyDown=TRUE;
       break;
       default:
       break;
       }
    }
    case WM_KEYUP:
    InvalidateRect(hWnd, NULL, FALSE);
    UpdateWindow(hWnd);
    break;
    case WM_CHAR:
    if(wParam==(65&VK_CONTROL))
    {
    nCtrlAKeyDown=TRUE;
    //MessageBox( hWnd, (LPCTSTR)nCtrlA, TEXT("有键按下"), MB_OK);
    /*if(nCtrlKeyDown==TRUE)
    {
    nCtrlAKeyDown=TRUE;
    nCtrlKeyDown=FALSE;
    }*/
    }
    else if(wParam==98||wParam==66)
    {
    //MessageBox( hWnd, (LPCTSTR)nShiftB, TEXT("有键按下"), MB_OK);
    nShiftBKeyDown=TRUE;
    if(nShiftKeyDown==TRUE)
    {
    nShiftBKeyDown=TRUE;
    nShiftKeyDown=FALSE;
    }
    }
    InvalidateRect(hWnd, NULL, FALSE);
    UpdateWindow(hWnd);
    break;
    case WM_PAINT:
    hDC=BeginPaint(hWnd, &ps);
    hPen=(HPEN)GetStockObject(WHITE_PEN);
    hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);
    strcpy(chFont, "airblk");
    SelectObject(hDC, hPen);
    SelectObject(hDC, hBrush);
    SetTextColor(hDC, RGB(255,0,0));
    hF=CreateFont(40,0,0,0,400,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,
     CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,(LPCTSTR)chFont);
    if(nCtrlKeyDown==TRUE && nCtrlAKeyDown==FALSE)
    {
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nCtrl,strlen(nCtrl));
    nCtrlKeyDown=FALSE;

    }
    else if(nUpKeyDown==TRUE)
    {
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nUp,strlen(nUp));
    nUpKeyDown=FALSE;
    }
    else if(nShiftKeyDown==TRUE && nShiftBKeyDown==FALSE)
    {    
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nShift,strlen(nShift));
    nShiftKeyDown=FALSE;
       
    }
    else if(nCtrlAKeyDown==TRUE)
    {    
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nCtrlA,strlen(nCtrlA));
    nCtrlAKeyDown=FALSE;
    nCtrlKeyDown=FALSE;
    }
    else if(nShiftBKeyDown==TRUE)
    {   
    Rectangle(hDC,0,0,300,200);
    TextOut(hDC,X,Y,nShiftB,strlen(nShiftB));
    nShiftBKeyDown=FALSE;
    nShiftKeyDown=FALSE;
       
    } /*else
    {
    TextOut(hDC,X,Y,TEXT("不是预定义的输入操作!"),strlen("不是预定义的输入操作!"));
    }*/

    DeleteObject(hPen);
    DeleteObject(hBrush);
    EndPaint(hWnd,&ps);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return(0);
    default:
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
    }
    return 0;
    }BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)
    {
    HWND hWnd;
    hWnd=CreateWindow(TEXT("5_5"),TEXT("nKeyDown"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
    if (! hWnd)
    return FALSE;
    hWndMain=hWnd;
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
    }BOOL InitWindowsClass(HINSTANCE hInstance)
    {
    WNDCLASS WndClass;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=WndProc;
    WndClass.lpszClassName=TEXT("5_5");
    WndClass.lpszMenuName=NULL;
    WndClass.style=0;
    return RegisterClass(&WndClass);
    }