本程序含有不明bug,有时候退格之后,再击键会不听使唤。。。也许是因为,windows其他程序对内核的占用而导致了本程序部分键盘码丢失吧,具体原因不明。

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("KeyView1") ;
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, TEXT ("Keyboard Message Viewer #1"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

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)
{
static int   cxClientMax, cyClientMax, cxClient, cyClient, cxChar, cyChar , cLinesMax;
HDC          hdc ;
int          i = 0, iType, j ;
PAINTSTRUCT  ps ;
static TCHAR      szBuffer[70] ; //szKeyName [32] ;
PTCHAR pcha ;
TEXTMETRIC   tm ;
static RECT rectScroll ;
static int * tpmsg, *ina;
static int isz = 0;
TCHAR szTop[ 20 ] = L"请用键盘输入:" ;

switch (message)
{
case WM_CREATE:
hdc = GetDC (hwnd) ;

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; //等宽字体
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight ;

ReleaseDC (hwnd, hdc) ;
return 0;
/*case WM_DISPLAYCHANGE: //窗口分辨率改变时会发送这个消息

// Get maximum size of client area

cxClientMax = GetSystemMetrics (SM_CXMAXIMIZED) ;
cyClientMax = GetSystemMetrics (SM_CYMAXIMIZED) ;
//窗口最大化缺省值
// Get character size for fixed-pitch font                  */

case WM_SIZE:

cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;

// Calculate scrolling rectangle
if( tpmsg )
free( tpmsg );
cLinesMax = cxClient / cxChar ;
tpmsg = ( int * ) malloc ( cLinesMax * sizeof( int ) ) ;

rectScroll.left   = 0 ;
rectScroll.right  = cxClient ;                                
rectScroll.top    = cyChar ;
rectScroll.bottom = 2 * cyChar;

InvalidateRect (hwnd, NULL, TRUE) ;

return 0 ;

case WM_CHAR:
switch( wParam )
{
case VK_RETURN:
break;

case VK_BACK:
isz--;
InvalidateRect( hwnd, &rectScroll, TRUE ) ; //是第二行变为无效区域,并把WM_PAINT消息放入队列
UpdateWindow( hwnd ) ; //判断是否有无效区域( WM_PAINT ),如果有就立刻刷新屏幕
break;

default:
szBuffer[ isz++ ] = wParam ;
InvalidateRect( hwnd, &rectScroll, TRUE ) ; //是第二行变为无效区域,并把WM_PAINT消息放入队列
UpdateWindow( hwnd ) ; //判断是否有无效区域( WM_PAINT ),如果有就立刻刷新屏幕
break;
}
return 0;

case WM_PAINT:
hdc = BeginPaint( hwnd, &ps ) ;
SelectObject( hdc, GetStockObject( SYSTEM_FIXED_FONT ) );
SetBkMode( hdc, TRANSPARENT ) ;

if( isz > 69 )
MessageBox( hwnd, TEXT("数组越界"), TEXT("isz"), MB_OK ) ; 
pcha = ( PTCHAR ) malloc ( ( 70 ) * sizeof( TCHAR ) ) ;
wcscpy( pcha, szBuffer ) ; //tchar 版本的 strcpy函数

TextOut( hdc, 0, 0, szTop, lstrlen( szTop ) ) ;
TextOut( hdc, 0, cyChar, pcha, isz  ) ;

free( pcha ) ;
EndPaint( hwnd, &ps ) ;
return 0;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

模仿dos窗口下的windows窗口程序相关推荐

  1. wine在linux的运行效率,Wine(在Linux下执行Windows应用程序)V1.9.24稳定版

    Wine(在Linux下执行Windows应用程序)V1.9.24稳定版 wine是一款优秀的Linu系统平台下的模拟器软件,wine用来将Windows系统下的软件在Linux系统下稳定运行,该软件 ...

  2. linux 调用 wine 程序,Wine官方版|Wine v3.8 Development在Linux下执行Windows应用程序 官方英文版 - 维维软件园...

    Wine官方版下载,Wine是小编为大家整理的一款在Linux操作系统下履行有些Windows应用程序的工具程序,如果你想在Linux下运行Windows程序,Wine是你的必备工具,Wine在X和U ...

  3. 窗口封装类与Windows窗口实例的关系-3、CWnd如何处理窗口消息

    在窗口消息处理方面,CWnd使用了窗口子类化和消息映射机制,关于消息映射的知识将在第9章详述,下面着重阐述CWnd是如何应用子类化处理窗口消息的.其实,在6.2节的示例中,CBaseWnd已经使用了与 ...

  4. 在DOS环境下制作Windows启动盘

    制作一张系统启动盘可以在Windows系统出现问题的时候,使用启动盘来引导系统,然后再查找故障并加以解决,下面就来介绍一下制作启动盘的方法. 1.在Windows中创建启动盘 打开控制面板,双击&qu ...

  5. linux解决windows应用程序,关于Linux下使用Windows应用程序的尝试总结

    mssqlserver数据导出到另外一个数据库 mssqlserver数据导出到另外一个数据库 准备源数据库,找到想要导出的数据库,右键选择"任务"再选择"导出数据&qu ...

  6. 【MFC】Windows窗口样式

    00. 目录 文章目录 00. 目录 01. 框架窗口样式 02. 静态样式 03. 窗口样式 04. 扩展的窗口样式 05. 附录 01. 框架窗口样式 框架窗口样式适用于 CFrameWnd 类 ...

  7. 在DOS环境下win7系统与win10系统的编程、链接及运行步骤(非常适合第一次学习DOS的小萌新入手)

    文中如有不足或错误之处,欢迎大家指正! 任务:编写一个简单的汇编程序(在屏幕上打印 Hello World!),使该程序能够链接.运行,最终得到正确结果. win7和win10编程时对应的资料放在以下 ...

  8. linux里运行windows,在Linux上运行Windows应用程序

    当前位置:我的异常网» Linux/Unix » 在Linux上运行Windows应用程序 在Linux上运行Windows应用程序 www.myexceptions.net  网友分享于:2015- ...

  9. 解决双硬盘下一个windows两个linux操作系统的grub引导问题

    问题表现:联想扬天老台式机,机械硬盘安装有windows10和UbuntuStudio,后加装一块SSD后在其上安装了Manjaro,安装的时候并未关闭机械硬盘,重启后Manjaro的grub主引导菜 ...

最新文章

  1. 5.2 测试计划和估算
  2. iOS开展——全球应对MotionEvent
  3. java静态内部类(嵌套类)
  4. 【阿里云OSS】403错误,AccessDenied:The bucket you access does not belong to you.
  5. 任务计划程序设置软件在电脑重启后启动
  6. 【092】韦达定理在一元n次方程中的推广
  7. 四足机器人足端轨迹规划--摆线
  8. 支持OnVif协议的摄像头直播推流php
  9. 五个最适合做博客的开源系统 开源免费大量精美模板使用!
  10. 深度解读物联网区块链“IOTA”:不仅解决IoT痛点,还解决区块链痛点
  11. HTTP状态码的含义
  12. 上海交大和MIT提出的软性机械手,可提供实时的触觉控制
  13. Android measure方法详解
  14. go time.after
  15. python 语法基础篇
  16. EasyPR--开发详解(9)文字定位
  17. 基于VHDL语言的状态机设计
  18. xcode怎样配置GLUT和GLTools
  19. spark和presto比较
  20. 应急响应-window入侵排查

热门文章

  1. Unity任意方向拉伸物体
  2. 什么是对齐,为什么要对齐
  3. 家谱文化④:江苏百岁老人多达8375人,健康长寿的秘密都写在家谱
  4. 自建服务器和购买云服务器的过程总结
  5. 未睹棺椁先哭君——谷歌墓志铭
  6. 第一次软工作业(构建之法)
  7. docker之user_remap
  8. 顺丰云服务器,基于华为云云原生解决方案,顺丰“快递+”这一项业务效率提升了48倍...
  9. python对图片颜色校正,使用Python PIL更改图像色调
  10. 4.3、Android Studio突破64K方法限制