win32_API里的WM_KEYDOWN和WM_KEYUP

作者&投稿:丰空 (若有异议请与网页底部的电邮联系)
MFC中WM_KEYUP和WM_KEYDOWN的用法~

有几个东西你得明白一下:
一,WM_KEYUP和WM_KEYDOWN是消息
二,在MFC中,消息是由类响应的,你在对话框中按键了,你可以对话框类中进行响应(也就是对一整型变量+1)

以下为在主框架类中进行WM_KEYUP响应。
你用MFC建一单文档工程时会自动生成一个CMainFrame类,你右击这个类名(在类视图中)点击添加一个成员变量(可以设为你想要的类型)比如类型(第一个文本框)int 变量名(第二个文件框)设为abc,下面设为public.
第二步,给这个变量一个初值。你双击CMainFrame类的构造函数(这个应该知道吧),在函数最后你加一行:
abc=0;
得加在return函数之前啊!

第三步对CMainFrame类的WM_KEYUP(DOWN随你高兴用那个)进行消息响应。操作为:右击CMainFrame类名选添加消息响应(英文应该是Add window Message Handle……)然后在弹出的窗口中的左边的消息框中找到WM_KEYUP消息后双击,再对这个消息响应进行代码编辑(点edit exiting)
在里面输一行代码就可了:
abc++;


自学难啊,加油!

说详细点可以 吗?

持续按住一个键不放是产生多个WM_KEYDOWN,最后只产生一个WM_KEYUP,你的timer无法被处理是因为WM_TIMER在消息队列中的优先级别很低,你按下键的时候在不断地向窗口发送WM_KEYDOWN消息,所以timer的消息处理不到,解决方法是在消息循环里做手脚,如果按下了一个键而没有弹起的话,就忽略之后的按键消息,这样就能腾出时间来处理timer了:

#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
WNDCLASS ws;

ws.style = CS_HREDRAW | CS_VREDRAW;
ws.lpfnWndProc = WndProc;
ws.cbClsExtra = 0;
ws.cbWndExtra = 0;
ws.hInstance = hInstance;
ws.hIcon = LoadIcon(NULL, IDI_APPLICATION);
ws.hCursor = LoadCursor(NULL, IDC_ARROW);
ws.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
ws.lpszMenuName = NULL;
ws.lpszClassName = "Timer";

if(!RegisterClass(&ws))
return 0;

HWND hwnd = CreateWindow("Timer",
NULL,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);

MSG msg;
bool hold = false;

while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
if(msg.message == WM_KEYDOWN && !hold)
{
hold = true;
DispatchMessage(&msg);
}
else if(msg.message == WM_KEYDOWN)
; // 忽略多余的按键
else if(msg.message == WM_KEYUP)
{
hold = false;
DispatchMessage(&msg);
}
else
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static TCHAR szBuf[32];
HDC hdc;
TEXTMETRIC tm;
static UINT key;
static int cyChar, i = 1;

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

GetTextMetrics (hdc, &tm) ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc) ;
return 0;

case WM_KEYDOWN:
key = wParam;
SetTimer(hwnd, 1, 1000, NULL);
InvalidateRect(hwnd, NULL, TRUE);
return 0;

case WM_TIMER:
hdc = GetDC(hwnd);
TextOut(hdc, 0, 0, szBuf, wsprintf(szBuf, "Key: '%c' %d sec", key, i++));
ReleaseDC(hwnd, hdc);
return 0;

case WM_KEYUP:
hdc = GetDC(hwnd);
i = 1;
TextOut(hdc, 0, cyChar, szBuf, wsprintf(szBuf, "Done!"));
ReleaseDC(hwnd, hdc);
KillTimer(hwnd, 1);
return 0;

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

持续按住一个键不放是产生多个WM_KEYDOWN,最后只产生一个WM_KEYUP,你的timer无法被处理是因为WM_TIMER在消息队列中的优先级别很低,你按下键的时候在不断地向窗口发送WM_KEYDOWN消息,所以timer的消息处理不到,解决方法是在消息循环里做手脚,如果按下了一个键而没有弹起的话,就忽略之后的按键消息,这样就能腾出时间来处理timer了:
#include
<windows.h>
LRESULT
CALLBACK
WndProc(HWND,
UINT,
WPARAM,
LPARAM);
int
WINAPI
WinMain(HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
PSTR
szCmdLine,
int
iCmdShow)
{
WNDCLASS
ws;
ws.style
=
CS_HREDRAW
|
CS_VREDRAW;
ws.lpfnWndProc
=
WndProc;
ws.cbClsExtra
=
0;
ws.cbWndExtra
=
0;
ws.hInstance
=
hInstance;
ws.hIcon
=
LoadIcon(NULL,
IDI_APPLICATION);
ws.hCursor
=
LoadCursor(NULL,
IDC_ARROW);
ws.hbrBackground
=
(HBRUSH)GetStockObject(WHITE_BRUSH);
ws.lpszMenuName
=
NULL;
ws.lpszClassName
=
"Timer";
if(!RegisterClass(&ws))
return
0;
HWND
hwnd
=
CreateWindow("Timer",
NULL,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,
iCmdShow);
UpdateWindow(hwnd);
MSG
msg;
bool
hold
=
false;
while(GetMessage(&msg,
NULL,
0,
0))
{
TranslateMessage(&msg);
if(msg.message
==
WM_KEYDOWN
&&
!hold)
{
hold
=
true;
DispatchMessage(&msg);
}
else
if(msg.message
==
WM_KEYDOWN)
;
//
忽略多余的按键
else
if(msg.message
==
WM_KEYUP)
{
hold
=
false;
DispatchMessage(&msg);
}
else
DispatchMessage(&msg);
}
return
msg.wParam;
}
LRESULT
CALLBACK
WndProc(HWND
hwnd,
UINT
message,
WPARAM
wParam,
LPARAM
lParam)
{
static
TCHAR
szBuf[32];
HDC
hdc;
TEXTMETRIC
tm;
static
UINT
key;
static
int
cyChar,
i
=
1;
switch(message)
{
case
WM_CREATE:
hdc
=
GetDC
(hwnd)
;
GetTextMetrics
(hdc,
&tm)
;
cyChar
=
tm.tmHeight
+
tm.tmExternalLeading
;
ReleaseDC
(hwnd,
hdc)
;
return
0;
case
WM_KEYDOWN:
key
=
wParam;
SetTimer(hwnd,
1,
1000,
NULL);
InvalidateRect(hwnd,
NULL,
TRUE);
return
0;
case
WM_TIMER:
hdc
=
GetDC(hwnd);
TextOut(hdc,
0,
0,
szBuf,
wsprintf(szBuf,
"Key:
'%c'
%d
sec",
key,
i++));
ReleaseDC(hwnd,
hdc);
return
0;
case
WM_KEYUP:
hdc
=
GetDC(hwnd);
i
=
1;
TextOut(hdc,
0,
cyChar,
szBuf,
wsprintf(szBuf,
"Done!"));
ReleaseDC(hwnd,
hdc);
KillTimer(hwnd,
1);
return
0;
case
WM_DESTROY:
PostQuitMessage(0);
return
0;
}
return
DefWindowProc(hwnd,
message,
wParam,
lParam);
}


配置的问题
大多用户习惯于使用众多的图形化管理工具来管理Windows资源,在WMI之前这些工具都是通过 Win32应用程序编程接口(Application ProgrammingInterfaces,API)来访问和管理Windows资源的。只要你熟悉系统编程你就知道API有多么重要。但是大多数脚本语言都不能直接调用Win32 API,WMI的出现使得系统管理员可以通过一种简便的方法即利...

C++的WIN32怎么建文件夹?
调用 Win32 API函数 CreateDirectory (),例如在 c盘 创建一个“123”的文件夹:CreateDirectory("C:\\\\123",NULL);接受2个参数,第一个为存在的路径,第2个一般为NULL。需要 头文件 Winbace.h,需要链接库Coredll.lib。下面是msdn的原文:BOOL CreateDirectory(LPCTSTR lpPathName,LPSECURITY_...

通过摄像头拍照后识别文字,并将有用的信息存放到excel
import cv2 import requests import base64 import json import re import openpyxl,random import os import win32api,win32con import glob if os.path.lexists('数据库.xlsx'):os.remove('数据库.xlsx')print('已经存在数据表')wb=openpyxl.load_workbook('数据库.xlsx')ws=wb.active ws['A...

Windows未成功关闭。如果这是由于系统无响应,或者是为保护数据而关闭系...
这个故障你的描述不够详细,也没提供故障代码,所以建议你利用我总结的通用的系统修复方法尝试解决,具体如下:先关机,然后打开主机箱,把硬盘的电源线和数据线拔下来,然后过2分钟再插上,重新开机试试。然后用下述方法修复系统:开机不断点击F8键,进入系统操作选单(如果是Win8,Win8.1,Win10系统,...

用python win32 获得计算器里的计算结果
): windows = [] results = [] win32gui.EnumWindows(_MyCallback, (windows)) i = 0 for hwnd in windows: if win32gui.GetClassName(hwnd) == 'CalcFrame': m_index = [] win32gui.EnumChildWindows(hwnd,...

win32程序创建线程用c语言库的_beginthread还是API的CreateThread?哪种用...
\/\/ Wrap desired thread function in SEH frame to\/\/ handle run-time errors and signal support.__try {\/\/ Call desired thread function, passing it the desired parameter.\/\/ Pass thread's exit code value to _endthreadex._endthreadex(( (unsigned (WINAPI *)(void *))(((_ptiddata)ptd)->...

C:WINDOWSsystem32sksuser.dll为无效的windows映像,请再检测一遍您的...
就是c:\\windows\\system32\\wininat.dll不存在或者坏了。 搜寻引擎里输入wininat.dll搜寻,下载一个放原来路径里就成啦~ C:\\WINDOWS\\SYSTEM32\\GrTZqG5SnRhAt.dll为无效Windows映像。请再检测一遍您的安装盘。 GrTZqG5SnRhAt.dll这个档案已经被系统删除了,但在启动组中还有它的阴魂,必须去掉,不然你上网时黑客...

API 函数GetTextExtentPoint 到底怎么用 看不懂解释
好吧,其实我也没用过,不过我看 MSDN 解释的挺清楚的~,大概翻译一下:函数 GetTextExtentPoint32() 用于计算指定文本字符串的宽和高。函数声明:BOOL GetTextExtentPoint32( _In_ HDC hdc, _In_ LPCTSTR lpString, _In_ int c, _Out_ LPSIZE lpSize);参数列表:hdc[in...

C#中如何调用系统API,将某个程序添加到Windows计划任务中去?_百度知 ...
看起来是这几个函数 DLL - Netapi32.dll NET_API_STATUS NetScheduleJobAdd(__in LPCWSTR Servername,__in LPBYTE Buffer,__out LPDWORD JobId );NET_API_STATUS NetScheduleJobDel(__in LPCWSTR Servername,__in DWORD MinJobId,__in DWORD MaxJobId );NET_API_STATUS Net...

您好,我还不太懂这些win32的引用,按照您昨天说的我把 [DllImport("user...
比如 WIN32API.GetWindowDC public static class WIN32API{ [DllImport("gdi32.dll", EntryPoint = "DeleteObject")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DeleteObject([In] IntPtr hObject); [DllImport("gdi32.dll", EntryPoint = "DeleteDC")] ...

建瓯市17189085674: win32 - API里的WM - KEYDOWN和WM - KEYUP -
养曹呋脲: 持续按住一个键不放是产生多个WM_KEYDOWN,最后只产生一个WM_KEYUP,你的timer无法被处理是因为WM_TIMER在消息队列中的优先级别很低,你按下键的时候在不断地向窗口发送WM_KEYDOWN消息,所以timer的消息处理不到,解...

建瓯市17189085674: vbs中如何长按键
养曹呋脲: 调用Win32API,先FindWindow,然后SendMessage,先发WM_KEYDOWN,等需要再发WM_KEYUP. 如果有系统键,比如ATL等,需要WM_SYSKEYDOWN等. 消息一览参见 http://dev.csdn.net/htmls/73/73242.html Win32API的VB定义: ...

建瓯市17189085674: Windows API函数 是什么 -
养曹呋脲: API的英文全称(Application Programming Interface),WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口.对这个定义的理解,需要追溯到操作系统的发展历史上,当WINDOWS操作系统开始占据主导地位的时候,开发...

建瓯市17189085674: python获取打开的应用窗口输入字符 -
养曹呋脲: 用win32模块(第三方模块需要下载安装) 方法win32gui.FindWindow()#获取每个应用程序的窗口 win32gui.FindWindowEx()#获取上面窗口下的控件 获取控件可以用spy++这款软件 win32gui.SendMessage()#输入'字符' win32gui.PostMessage()#按下发送按钮,具体参数网上找找 有问题可以问下

建瓯市17189085674: 求C#写键盘记录的源代码 -
养曹呋脲: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Reflection; using System.Windows.Forms; namespace Tool { class KeyHook { public event ...

建瓯市17189085674: WIN32API中,按下字母键为什么得到的WM -
养曹呋脲: BOOL InvalidateRect( __in HWND hWnd,__in const RECT *lpRect,__in BOOL bErase); 这才是InvalidateRect的原型.你将lpRect设为NULL,所以才更新整个区域.如果你传入一个矩形区域结构的指针.那么就只会更新这块矩形区域.还有这...

建瓯市17189085674: 关于VC的WIN32编程中按键相应的问题 -
养曹呋脲: 如果是键被按下响应以下代码就可以 int g_KeyValue = -1;//全局变量 键盘按下事件中 KeyPressEvents(int Value) { if (Value == g_KeyValue) { return; } g_KeyValue = Value; 按键值处理部分代码 } 键盘释放事筏缉摧垦诋旧搓驯掸沫件 KeyUpEvents(int Value) { if (Value == g_KeyValue) g_KeyValue = -1; } 这样一个键被按下时会响应,一直按住就不会响应,直到释放以后,重新按下,再次响应

建瓯市17189085674: 纯WIN32API程序,不是MFC.修改响应回车按键 -
养曹呋脲: 在窗口过程函数中,对WM_CHAR消息进行响应,其中wParam Specifies the character code of the key. 回车键为VK_ENTER

建瓯市17189085674: win32 SDK平台下自定义消息WM - SELFMSG由工作线程1发送给线程2接受响应做某事,请给个实例.
养曹呋脲: 首先,主线程必须是窗体线程,也就是主线程负责窗体的消息处理 , 然后用 _beginthreadex 开一个后台线程,在后台线程里面用 SendMessage 或者 PostMessage 给主线程发送 WM_SELFMSG 消息就可以了,主线程 case WM_SELFMSG 之后就可以处理了 . Win32 SDK 自定义消息非常简单,用 #define 就可以了,比如 : #define WM_SELFMSG WM_USER + 1 要注意的是,自定义消息的值一定要大于 WM_USER 但不能等于,因为 WM_USER 以下的值都是保留给系统使用的,否则会产生消息冲突 .

建瓯市17189085674: 如何使用python修改注册表 -
养曹呋脲: 通过使用win32api模块和win32con模块,python可以方便地访问注册表,并对其进行打开、关闭、添加项、删除项,以及添加、修改项值等操作.1. 打开注册表 RegOpenKey(key, subkey, reserved, sam) RegOpenKeyEx(key, subkey, reserved, ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网