求解模拟键盘输入

CrazyHosptial 2003-12-21 12:42:26
小弟做一个程序...里面需要模拟键盘输入...
为了使大家更好的帮我..我说明一下...
小弟所要求实现的是: 程序运行后...点击程序上的一个按钮(例如是 Cmd1吧..)
当点击cmd1按钮后..该程序最小化运行..这个时候当你在键盘上按下"P"这个按键的时候.
程序会在后台模拟键盘输入"ABCDEFG"
此事如果打开记事本并且按下"P"这个键的话..记事本中就会逐个出现ABCDEFG这几个字母..就好像是键盘替你按了一样...
不知道小弟说的意思大家明不明白...小弟很菜...还请大家多多帮忙...
最好是原码贴出..这样小弟可以看的明白...
该贴50分是提问的.问题解决后另开新贴诚心赠送100分值!谢谢!
对该贴没有兴趣的朋友还请多多帮忙给小弟顶一下..谢!
...全文
79 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyHosptial 2003-12-24
  • 打赏
  • 举报
回复
感谢诸位的回复...
另开新贴希望以下二位进去领分...
谢谢你们的热心帮助!

mmcgzs(毛毛虫)
online(龙卷风(白学了,重新充电中))
rainstormmaster 2003-12-21
  • 打赏
  • 举报
回复
就是这样,设置热键,进行子类处理
Mars.CN 2003-12-21
  • 打赏
  • 举报
回复
哦!哦!哦!
又是API!!!
怎么学!!!!
有学习API
mmcgzs 2003-12-21
  • 打赏
  • 举报
回复
具体过程如下:
1。建立一个模块写入下面的代码
Option Explicit
public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const WM_HOTKEY = &H312
Public oldproc As Long
Public Function RegisterWindow(hwnd As Long) As Long
If hwnd <> 0 Then
oldproc = SetWindowLong(hwnd, -4, AddressOf WinProc)
End If
End Function
Public Function unRegisterWindow(hwnd As Long) As Long

If hwnd <> 0 Then
SetWindowLong hwnd, -4, oldproc
End If

End Function
Public Function WinProc(ByVal hwnd As Long, ByVal msg As Long, ByVal lpara As Long, ByVal wpara As Long) As Long

If msg = WM_HOTKEY Then
If lpara = &HBFFF& Then
keybd_event vbKeyA, 0, 0, 0
keybd_event vbKeyB, 0, 0, 0
keybd_event vbKeyC, 0, 0, 0
keybd_event vbKeyD, 0, 0, 0
End If
End If

WinProc = CallWindowProc(oldproc, hwnd, msg, lpara, wpara)


End Function

新建一个窗体,不需任何控件,加入以下代码:

Private Sub Form_Load()

RegisterWindow Me.hwnd
RegisterHotKey Me.hwnd, &HBFFF&, 0, vbKeyP
End Sub

Private Sub Form_Unload(Cancel As Integer)
unRegisterWindow Me.hwnd
UnregisterHotKey Me.hwnd, &HBFFF&
End Sub


这样就可以,我刚测试通过
mmcgzs 2003-12-21
  • 打赏
  • 举报
回复
这个也比较容易实现,需要用到子类

Public Declare Function RegisterHotKey Lib "user32" Alias "RegisterHotKey" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
------------------------------------------------------------------------------------
hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。
id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。
fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:
MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。
MOD_SHIFT:按下的可以是任一Shift键。
MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。
vk:定义热键的虚拟键码。

--------------------------------------------------------------------------------
用他注册一个HOTKEY
然后需要一个消息处理过程在模块里

当用户按下P键是就用
Public Declare Sub keybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
---------------------------------------------------------------------------
bVk ------------ Byte,欲模拟的虚拟键码

bScan ---------- Byte,键的OEM扫描码

dwFlags -------- Long,零;或设为下述两个标志之一
KEYEVENTF_EXTENDEDKEY
指出是一个扩展键,而且在前面冠以0xE0代码
KEYEVENTF_KEYUP
模拟松开一个键

dwExtraInfo ---- Long,通常不用的一个值。api函数GetMessageExtraInfo可取得这个值。允许使用的值取决于特定的驱动程序
--------------------------------------------------------------------------
执行你需要按下的键的值



建议看一些关于子类的东西
flc 2003-12-21
  • 打赏
  • 举报
回复
li厉害
学习
online 2003-12-21
  • 打赏
  • 举报
回复
理解错了,你看看
Option Explicit
' 声明API函数
Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long
Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Private Declare Function WaitMessage Lib "user32" () As Long
' 声明结构
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type Msg
hWnd As Long
Message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
' 声明常数
Private Const MOD_ALT = &H1
Private Const MOD_CONTROL = &H2
Private Const MOD_SHIFT = &H4
Private Const PM_REMOVE = &H1
Private Const WM_HOTKEY = &H312

Private HotKey_Flg As Boolean

Private Sub Form_Load()
Me.WindowState = 1
Dim Message As Msg

'注册 Ctrl+Shift+I 为热键
RegisterHotKey Me.hWnd, &HBFFF&, MOD_CONTROL + MOD_SHIFT, vbKeyI
Me.Show
'等待处理消息
HotKey_Flg = False
Do While Not HotKey_Flg
'等待消息
WaitMessage
'检查是否热键被按下
If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
'打开计算器程序
Shell "calc.exe", vbNormalFocus
End If
'转让控制权,允许操作系统处理其他事件
DoEvents
Loop
End Sub

Private Sub Form_Unload(Cancel As Integer)
HotKey_Flg = True
'撤销热键的注册
Call UnregisterHotKey(Me.hWnd, &HBFFF&)
End Sub


CrazyHosptial 2003-12-21
  • 打赏
  • 举报
回复
效果就像 金山游侠2002里面的"一键必杀"的简单宏编辑器一样..
只不过小弟的程序是把特定的指令固化进去了一样..
恳请帮忙..谢谢!!
CrazyHosptial 2003-12-21
  • 打赏
  • 举报
回复
好像不是这个意思..是说模拟键盘输入..
如何在输入的时候很真实的模拟键盘的输入..就是去掉下面的这个..依旧输入"ABCDEFG"
Shell "c:\winnt\notepad.exe", vbNormalFocus
还有就是程序运行后...如何最小化后..不管是在任何界面下只要按"P"
就像是按了ABCDEFG一样...上面这个..小弟编译后一旦最小化..P就失去作用了...
并不是只有在文本框里输入...小弟是这个意思..谢谢..
online 2003-12-21
  • 打赏
  • 举报
回复
Private Sub Form_KeyPress(KeyAscii As Integer)
Char = Chr(KeyAscii)
If Char = "p" Then
Shell "c:\winnt\notepad.exe", vbNormalFocus
SendKeys "A"
SendKeys "B"
SendKeys "C"
SendKeys "D"
SendKeys "E"
SendKeys "F"
SendKeys "G"
End If
End Sub

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧