鱼C论坛

 找回密码
 立即注册
查看: 1119|回复: 6

跟着小甲鱼敲代码,为什么按键盘没反应

[复制链接]
发表于 2024-8-9 00:26:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <windows.h>
  2. #include<strsafe.h>
  3. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  4. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  5. {
  6.     static TCHAR szAppName[] = TEXT("MyWindows");
  7.     HWND hwnd;
  8.     MSG msg;
  9.     WNDCLASS wndclass;

  10.     wndclass.style = CS_HREDRAW | CS_VREDRAW;
  11.     wndclass.lpfnWndProc = WndProc;
  12.     wndclass.cbClsExtra = 0;
  13.     wndclass.cbWndExtra = 0;
  14.     wndclass.hInstance = hInstance;
  15.     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  16.     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  17.     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  18.     wndclass.lpszMenuName = NULL;
  19.     wndclass.lpszClassName = szAppName;

  20.     if (!RegisterClass(&wndclass))
  21.     {
  22.         MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
  23.         return 0;
  24.     }

  25.     hwnd = CreateWindow(szAppName,
  26.         TEXT("hello"),
  27.         WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
  28.         CW_USEDEFAULT,
  29.         CW_USEDEFAULT,
  30.         CW_USEDEFAULT,
  31.         CW_USEDEFAULT,
  32.         NULL,
  33.         NULL,
  34.         hInstance,
  35.         NULL);

  36.     ShowWindow(hwnd, iCmdShow);
  37.     UpdateWindow(hwnd);

  38.     while (GetMessage(&msg, NULL, 0, 0))
  39.     {
  40.         TranslateMessage(&msg);
  41.         DispatchMessage(&msg);
  42.     }

  43.     return msg.wParam;
  44. }

  45. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  46. {
  47.     static int cxClientMax, cyClientMax, cxClient, cyClient, cxChar, cyChar;
  48.     static int cLinesMax, cLines;//客户区最大化可以容纳的行数,当前申请的内存块里面有的消息行数
  49.     static PMSG pmsg;
  50.     static RECT RectScroll;
  51.     static TCHAR szTop[] = TEXT("Message    Key   Char    Repeat Scan Ext Alt Prev Tran");
  52.     static TCHAR szUnd[] = TEXT("_______    ___   ___     ______ ____ ___ ___ ____ ____");
  53.     static TCHAR* szFormat[2] = { TEXT("%-13s %3d %-15s%c%6u %4d %3s %4s %4s"),
  54.                                   TEXT("%-13s            0x%04X%1s%c %6u %4d %3s %3s %4s %4s")};

  55.     static TCHAR* szYes = TEXT("Yes");
  56.     static TCHAR* szNo = TEXT("No");
  57.     static TCHAR* szDown = TEXT("Down");
  58.     static TCHAR* szUp = TEXT("Up");
  59.     static TCHAR * szMessage[] = { TEXT("WM_KEYDONE"),TEXT("WM_KEYUP"),TEXT("WM_CHAR"),TEXT("WM_DEADCHAR"),
  60.         TEXT("WM_SYSKEYDONE"),TEXT("WM_SYSKEYUP"),TEXT("WM_SYSCHAR"),TEXT("WM_SYSDEADCHAR") };
  61.     HDC hdc;
  62.     int iType;
  63.     size_t iTarget;
  64.     PAINTSTRUCT ps;
  65.     TCHAR szBuffer[128], szKeyName[32];
  66.     TEXTMETRIC tm;

  67.     int LinesTemp;//当前需要显示的行数


  68.     switch (message)
  69.     {
  70.     case WM_CREATE:
  71.         //不管,继续执行
  72.     case WM_DISPLAYCHANGE:
  73.         //客户区最大化或者最小化会产生这个消息
  74.         cxClientMax = GetSystemMetrics(SM_CXMAXIMIZED);
  75.         cyClientMax = GetSystemMetrics(SM_CYMAXIMIZED);

  76.         hdc = GetDC(hwnd);

  77.         //设置等宽字体
  78.         SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
  79.         GetTextMetrics(hdc, &tm);
  80.         cxChar = tm.tmAveCharWidth;
  81.         cyChar = tm.tmHeight;

  82.         ReleaseDC(hwnd, hdc);

  83.         if (pmsg)
  84.         {
  85.             free(pmsg);
  86.         }

  87.         //计算客户区最大高度可以容纳多少行
  88.         cLinesMax = cyClientMax / cyChar;
  89.         //申请一块内存,大小为客户区最大高度可以容纳的行数*一行多大(MSG类型占用多大空间)
  90.         pmsg = (PMSG)malloc( cLinesMax * sizeof(MSG));
  91.         cLines = 0;

  92.         //如果内存申请失败
  93.         if (pmsg == NULL)
  94.         {
  95.             MessageBox(hwnd, TEXT("内存申请失败"), TEXT("Error"), MB_OK);
  96.             PostQuitMessage(0);
  97.         }

  98.     case WM_SIZE:
  99.         if (message == WM_SIZE)
  100.         {
  101.             cxClient = LOWORD(lparam);
  102.             cyClient = HIWORD(lparam);
  103.         }
  104.         
  105.         //计算滚动的矩形
  106.         RectScroll.left = 0;
  107.         RectScroll.right = cxClient;
  108.         RectScroll.top = cyChar;
  109.         RectScroll.bottom = cyClient;

  110.         InvalidateRect(hwnd, NULL, TRUE);
  111.         return 0;

  112.     case WM_KEYDOWN:
  113.     case WM_KEYUP:
  114.     case WM_CHAR:
  115.     case WM_DEADCHAR:
  116.     case WM_SYSKEYDOWN:
  117.     case WM_SYSKEYUP:
  118.     case WM_SYSCHAR:
  119.     case WM_SYSDEADCHAR:
  120.         //这几个消息都这么干
  121.         for (int i = cLinesMax - 1; i > 0; i--)
  122.         {
  123.             pmsg[i] = pmsg[i - 1];
  124.         }

  125.         pmsg[0].hwnd = hwnd;
  126.         pmsg[0].message = message;
  127.         pmsg[0].lParam = lparam;
  128.         pmsg[0].wParam = wparam;
  129.         
  130.         //cLines这个变量的作用很难解释...
  131.         cLines = min(cLines + 1, cLinesMax);
  132.         ScrollWindow(hwnd, 0, -cyChar, & ScrollWindow, &ScrollWindow);

  133.         return 0;
  134.     case WM_PAINT:
  135.         hdc = BeginPaint(hwnd, &ps);
  136.         SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
  137.         //设置背景为透明色
  138.         SetBkMode(hdc, TRANSPARENT);
  139.         StringCchLength(szTop, 1024, &iTarget);
  140.         TextOut(hdc, 0, 0, szTop, iTarget);
  141.         StringCchLength(szUnd, 1024, &iTarget);
  142.         TextOut(hdc, 0, 0, szUnd, iTarget);

  143.         //当前需要显示的行数 = 当前内存块里面有的消息行数 和 当前客户区最多可以容纳的行数 中的小的那个,减一是因为最上面那一行显示的有文字
  144.         LinesTemp = min(cLines, cyClient / cyChar - 1);

  145.         for (size_t i = 0; i < min(cLines, cyClient / cyChar - 1); i++)
  146.         {
  147.             iType = (pmsg[i].message == WM_CHAR || pmsg[i].message == WM_SYSCHAR || pmsg[i].message == WM_DEADCHAR || pmsg[i].message == WM_SYSDEADCHAR);
  148.             GetKeyNameText(pmsg[i].lParam, szKeyName, 32);
  149.             StringCchPrintf(szBuffer, sizeof(szBuffer), szFormat[iType],
  150.                 szMessage[pmsg[i].message - WM_KEYFIRST],
  151.                 pmsg[i].wParam,
  152.                 (PTSTR)(iType ? TEXT("") : szKeyName),
  153.                 (TCHAR)(iType ? pmsg[i].wParam : ' '),
  154.                 LOWORD(pmsg[i].lParam),
  155.                 HIWORD(pmsg[i].lParam) & 0xff,
  156.                 0x01000000 & pmsg[i].lParam ? szYes : szNo,
  157.                 0x20000000 & pmsg[i].lParam ? szYes : szNo,
  158.                 0x40000000 & pmsg[i].lParam ? szDown : szUp,
  159.                 0x80000000 & pmsg[i].lParam ? szUp : szDown);
  160.             StringCchLength(szBuffer, sizeof(szBuffer), &iTarget);
  161.             TextOut(hdc, 0, (cyClient / cyChar - 1 - i)*cyChar, szBuffer, iTarget);

  162.             TextOut(hdc, 100, 100, TEXT("kkkk"), 4);

  163.             TextOut(hdc, 100, 100, TEXT("kkkk"), 4);

  164.         }

  165.         EndPaint(hwnd, &ps);
  166.         return 0;
  167.     case WM_DESTROY:
  168.         PostQuitMessage(0);
  169.         return 0;
  170.     }

  171.     return DefWindowProc(hwnd, message, wparam, lparam);
  172. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-8-9 00:34:54 | 显示全部楼层
fishc助手去哪里了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-9 00:38:41 | 显示全部楼层
fishc助手挂了?????????????????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-9 09:05:28 | 显示全部楼层
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-9 09:20:32 | 显示全部楼层
哪要是不跟着小甲鱼敲代码,键盘会不会有反应?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-9 17:17:38 | 显示全部楼层
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-9 17:21:08 | 显示全部楼层
sun_chuan 发表于 2024-8-9 00:38
fishc助手挂了?????????????????

fishc确实不见了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-6 14:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表