`
mixer_a
  • 浏览: 346023 次
社区版块
存档分类
最新评论

编程使用系统热键{定时器SetTimer()和GetAsyncKeyState()}

 
阅读更多
GetAsyncKeyState()
=========================
功能:确定用户当前是否按下了键盘上的一个键
原型:SHORT GetAsyncKeyState(int vKey);

参数:nVirtKey指出要检查键的虚键代码。结果的高位指出该键当前是否被按下(是为1,否为0)。
常用键的VK值:
VK_SHIFT Shift键
VK_LSHIFT 左Shift键
VK_RSHIFT 右Shift键
VK_CONTROL Ctrl键
VK_LCONTROL 左Ctrl键
VK_RCONTROL 右Ctril键
VK_MENU Alt键
VK_LMENU 左Alt键
VK_RMENU 右Alt键
VK_LBUTTON 鼠标左键
VK_RBUTTON 鼠标右键

另一个函数GetKeyState与GetAsyncKeyState函数不同。GetAsyncKeyState在按下某键的同时调用,判断正在按下某键。
GetKeyState则在按过某键之后再调用,它返回最近的键盘消息从线程的队列中移出时的键盘状态,判断刚按过了某键。

与RegisterHotKey()相比,GetAsyncKeyState()的优点在于可以监控鼠标按键,缺点是需要使用定时器,并且无法保证热键的惟一性。

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 文件名: HotKey2.asm
; 作 者: Purple Endurer
; 功 能: 演示定时器SetTimer()和GetAsyncKeyState()
; 点击“监测Alt+鼠标右键! 成功后按
; Alt+鼠标右键可打开记事本!”按钮,
; 则尝试监测Alt+鼠标右键是否按下
; 如果尝试不成功,则提示出错信息!
; 如果尝试成功,则按Alt+鼠标右键时,
; 可将当前程序窗口恢复到前台
; 并启动计事本!
; 开发环境:Windows 2000 Pro + MASM32
; 注:源代码和可执行程序可以到http://purpleendurer.ys168.com下载
;
; Date log
;-------------------------------------------------
;2006-03-09 创建!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc
include /masm32/include/shell32.inc
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/shell32.lib

WinMain proto :DWORD, :DWORD, :DWORD, :DWORD

m_m2m MACRO d1, d2
push d2
pop d1
ENDM


.const
c_ButtonID equ 1
c_TimerID equ 1

.data
g_szWinClsName db "DemoWinClass", 0
g_szAppName db "系统演示程序2 by PurpleEndurer", 0
g_szBtnClsName db "button", 0
g_szFailSetTimer db "不能"
g_szRegisterKey db "监测Alt+鼠标右键! 成功后按Alt+鼠标右键可打开记事本!", 0
g_szFailKillTimer db "不能"
g_szUnregisterKey db "停止监测Alt+鼠标右键!", 0
g_bRegisted dword FALSE
g_szOpen db "Open", 0
g_szNotePad db "NotePad", 0

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
g_hwndButton HANDLE ?

.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET g_szWinClsName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx, NULL, ADDR g_szWinClsName, ADDR g_szAppName, /
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, /
hInst, NULL
mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax, msg.wParam
ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
.if g_bRegisted==TRUE
invoke KillTimer, hWnd, c_TimerID
.endif
invoke PostQuitMessage, NULL
.ELSEIF uMsg==WM_CREATE
;创建按钮
invoke CreateWindowEx, NULL, ADDR g_szBtnClsName, ADDR g_szRegisterKey, /
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,/
25, 25, 560, 50, hWnd, c_ButtonID, hInstance, NULL
mov g_hwndButton, eax

.ELSEIF uMsg==WM_COMMAND
mov eax, wParam
.IF lParam!=0
.IF ax==c_ButtonID
shr eax, 16
.IF ax==BN_CLICKED
.if g_bRegisted==TRUE
;禁用监测
invoke KillTimer, hWnd, c_TimerID
.IF eax==0
invoke MessageBox, hWnd, ADDR g_szFailKillTimer,/
ADDR g_szAppName, MB_ICONERROR
ret
.ENDIF

m_m2m g_bRegisted, FALSE
;修改按钮的文本
invoke SetWindowText, g_hwndButton, ADDR g_szRegisterKey
.else
;启用监测
invoke SetTimer, hWnd, c_TimerID, 100, NULL

.IF eax==0
invoke MessageBox, hWnd, ADDR g_szFailSetTimer,/
ADDR g_szAppName, MB_ICONERROR
ret
.ENDIF
m_m2m g_bRegisted, TRUE
;修改按钮的文本
invoke SetWindowText, g_hwndButton, ADDR g_szUnregisterKey
.endif
.ENDIF
.ENDIF
.ENDIF
.ELSEIF uMsg==WM_TIMER
invoke GetAsyncKeyState, VK_LMENU;左Alt键
test eax, 08000h
jz @F
invoke GetAsyncKeyState, VK_RBUTTON;鼠标右键
test eax, 08000h
jz @F
;把本程序窗口恢复到前台
invoke ShowWindow, hWnd, SW_RESTORE
invoke SetForegroundWindow, hWnd

;打开记事本
invoke ShellExecute, hWnd, ADDR g_szOpen, ADDR g_szNotePad, NULL, NULL, SW_RESTORE
@@:
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp

end start
分享到:
评论

相关推荐

    vc++2005定时器settimer()的使用

    vc++2005定时器settimer()的使用 查了一些资料,写了个简单的程序

    线程内使用SetTimer实现定时器

    线程内使用SetTimer实现定时器 代码中MyThreadTimer时线程定时器的实现

    VC++定时器,比SetTimer更精确

    VC++定时器,比SetTimer更精确

    VC++定时器定时器使用

    VC++ 定时器使用 定时器使用 VC++ 定时器使用 定时器使用

    MFC Timer(SetTimer/KillTimer)使用方法

    MFC 使用定时器的示例. 1,选择Dialog视图,右击选择“事件”. 2,选择“新建Windows消息/事件(N)”列表,添加WM_TIMER到右侧列表内。 3,cpp会自动生成 ...4,使用SetTimer启动定时器. 5,使用KillTimer取消定时器.

    VS2010在Win32控制台使用定时器实例

    基本网上很多定时器都是用MFC写的,而用win32方面比较少,项目用到定时器这块,所以顺便上传一份. 是在VS2010 --&gt; VC++ --&gt; Win32控制台建的工程.里面涉及线程/定时器,简单易用,下载完可直接运行.

    VC++6.0多媒体定时器位图透明钟表

    运行MyClocker.exe对话框应用程序,自动设置定时器SetTimer(1,1000,NULL),让void CMyClockerDlg::OnTimer(UINT nIDEvent)函数每一秒调用一张已经导入资源的钟表秒钟位图,同时声明新的变量来控制分针图和时针图...

    VC++ MFC 定时器函数 刷新窗口

    这个是VC定时器SetTimer函数,主要做的事情是循环,和刷新MFC对话框

    windows控制台定时器

    windows控制台使用定时器。使用系统的API函数settimer开启定时器。

    C++控制台用定时器实例代码

    使用SetTimer()进行设置定时器 使用KillTimer()关闭定时器 在OnTimer()函数中,响应WM_TIMER这个消息,也就是定时器的处理函数。 源代码 #define TIMER_UDP_QFX 3//定时器的ID int Period = 1000;//1000ms的...

    VC++ Timer 定时器使用源码

    在编程时,会经常使用到定时器。但是VC++中没有定时器控件,在使用过程中是通过SetTimer和KillTimer实现的。

    在Linux操作系统下实现定时器简介

    在Linux实现一个定时器,不像Win32下那样直观。在Win32调用SetTimer就行了,在Linux下则没有相应函数可以直接调用。定时器作为一个常用的功能,在Linux当然也有相应实现。本文介绍几种常用的方法。

    向 SetTimer的回调函数传递参数

    定时器事件的响应函数,即 VOID CALLBACK TimerProc() 不是由用户程序自己调用的,而是根据时钟事件借由操作系统内核调用的;那么,如何利用这些形式参数,传递程序逻辑处理所需要的参数呢?本文给出一个解决方案,...

    仿照vc定时器,我自己封装的CppTimer定时器类

    6、定时器的启动和停止,使用CCppTimer类中的SetTimer、KillTimer方法 注意:本类仿照vc的ontimer实现,如果是Windows的窗口应用程序项目,请先屏蔽掉dlg窗体基类自带的OnTimer方法后,在public继承CCppTimer类,来...

    VC 结合定时器隐藏进程一定时间.rar

    VC 隐藏进程,这个例子结合了计时器来实现,不是永久隐藏,是隐藏进程一定时间,根据定时器返回的时间,重新显示进程。  要实现这个过程,可编写以下代码:  LPREGISTERSERVICEPROCESS lpRegisterServiceProcess; ...

    QNX X86 64环境下测试验证的定时器demo

    QNX X86 64环境下测试验证的定时器demo, 测试进程可以启动多个定时器,调用库的SetTimer即可,OnTimer里判断是哪个定时器中断并对应处理。

    006定时器动画

    SetTimer()函数为窗口建立一定时器,并每隔一段时间发出WM_TIMER消息 UINT SetTime( HWND 接受定时器消息的窗口 UINT 定时器代号 UINT 时间间隔 TIMERPROC 处理响应函数); 2. 删除定时器 BOOL KillTimer( int ...

    VC中定时器用法

    VC中定时器用法 定时器的使用:三种方法 处理WM_CREATE消息时呼叫SetTimer

    MFC学习笔记2.0.pdf - MFC学习过程中的问题和疑难点总结

    SetTimer 、OnTimer()和 和 KillTimer() 粗略的说,Settimer 是设置一个计时器并开始执行计时器 Ontimer 中的代码,Ontimer 是计 时器所执行的代码。KillTimer 用于停止计时器。 或者说 Settimer 是设置定时器的,...

    易语言API定时器

    易语言API定时器源码,API定时器,子程序1,API_SetTimer,API_KillTimer

Global site tag (gtag.js) - Google Analytics