如何让程序最小化仍然执行特定的键盘操作。而不影响到别的应用程序

yangdong 2003-03-13 05:49:26
本人在网上找了很长时间没找到相关资料
肯请各位给个正解
...全文
119 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangdong 2003-03-14
  • 打赏
  • 举报
回复
怎么说呢。就是做一个游戏的外挂
不应该是外挂吧。
就是想挂机的时候。仍然可以干别的事。这个游戏挂机需要按住键盘
就是 这样
我的意思是让这个游戏最小化。之后还能挂机。但我又可以忙我的正经事了
谢谢各位解答
fgn1999 2003-03-13
  • 打赏
  • 举报
回复
做钩子
bu_wen 2003-03-13
  • 打赏
  • 举报
回复
用钩子的话.需要全局钩子.
可以注册系统热键.. hotkey.bas
Option Explicit
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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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 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

Const WM_HOTKEY = &H312
Const MOD_ALT = &H1
Const MOD_CONTROL = &H2
Const MOD_SHIFT = &H4
Const GWL_WNDPROC = (-4) '窗口函数的地址
Dim key_preWinProc As Long '用来保存窗口信息
Dim key_Modifiers As Long, key_uVirtKey As Long, key_idHotKey As Long
Dim key_IsWinAddress As Boolean '是否取得窗口信息的判断
Function keyWndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then
Select Case wParam 'wParam 值就是 key_idHotKey
Case 1 '激活 3 个热键后,3 个热键所对应的操作,大家在其他的程序中,只要修改此处就可以了,处理个数,视注册定.

Case 2

Case 3


End Select

End If

'将消息传送给指定的窗口

keyWndproc = CallWindowProc(key_preWinProc, hwnd, Msg, wParam, lParam)

End Function

Function SetHotkey(ByVal Hwnd as long,ByVal KeyId As Long, ByVal KeyAss0 As String, ByVal Action As String)

Dim KeyAss1 As Long

Dim KeyAss2 As String

Dim i As Long

i = InStr(1, KeyAss0, ",")

If i = 0 Then

KeyAss1 = Val(KeyAss0)

KeyAss2 = ""

Else

KeyAss1 = Right(KeyAss0, Len(KeyAss0) - i)

KeyAss2 = Left(KeyAss0, i - 1)

End If

key_idHotKey = 0

key_Modifiers = 0

key_uVirtKey = 0


If key_IsWinAddress = False Then '判断是否需要取得窗口信息,如果重复取得,再最后恢复窗口时,将会造成程序死掉

'记录原来的window程序地址

key_preWinProc = GetWindowLong(hwnd, GWL_WNDPROC)

'用自定义程序代替原来的window程序

SetWindowLong hwnd, GWL_WNDPROC, AddressOf keyWndproc

End If


key_idHotKey = KeyId

Select Case Action

Case "Add"

If KeyAss2 = "Ctrl" Then key_Modifiers = MOD_CONTROL

If KeyAss2 = "Alt" Then key_Modifiers = MOD_ALT

If KeyAss2 = "Shift" Then key_Modifiers = MOD_SHIFT

If KeyAss2 = "Ctrl+Alt" Then key_Modifiers = MOD_CONTROL + MOD_ALT

If KeyAss2 = "Ctrl+Shift" Then key_Modifiers = MOD_CONTROL + MOD_SHIFT

If KeyAss2 = "Ctrl+Alt+Shift" Then key_Modifiers = MOD_CONTROL + MOD_ALT + MOD_SHIFT

If KeyAss2 = "Shift+Alt" Then key_Modifiers = MOD_SHIFT + MOD_ALT

key_uVirtKey = Val(KeyAss1)

RegisterHotKey hwnd, key_idHotKey, key_Modifiers, key_uVirtKey '向窗口注册系统热键

key_IsWinAddress = True '不需要再取得窗口信息

Case "Del"

SetWindowLong hwnd, GWL_WNDPROC, key_preWinProc '恢复窗口信息

UnregisterHotKey hwnd, key_uVirtKey '取消系统热键

key_IsWinAddress = False '可以再次取得窗口信息

End Select

End Function

'上面是热键注册模块,这里是窗体模块.
'注册热键
SetHotkey form1.hwnd,1, "36", "Add" '"36"为home 的 虚拟键值.自己改
SetHotkey form1.hwnd,2, "35", "Add"
.
.
'可以注册多个..于模块里 case 对应处理
'卸载热键
SetHotkey form1.hwnd,1, "", "Del"
SetHotkey form1.hwnd,2, "", "Del"
.
.



用户 昵称 2003-03-13
  • 打赏
  • 举报
回复
like this

Option Explicit




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 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 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 bCancel As Boolean
Private Sub ProcessMessages()
Dim Message As Msg
'loop until bCancel is set to True
Do While Not bCancel
'wait for a message
WaitMessage
'check if it's a HOTKEY-message
If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then

Select Case Message.wParam
Case &HBFFF&
WindowState = vbMaximized
Case &HC000&
WindowState = vbMinimized
Case &HC001&
WindowState = vbNormal
Case Else
End Select
Me.SetFocus
End If
'let the operating system process other events
DoEvents
Loop
End Sub
Private Sub Form_Load()
Dim ret As Long
bCancel = False
'register the Ctrl-F hotkey
Call RegisterHotKey(Me.hWnd, &HBFFF&, 0, vbKeyF9) 'vbMaximized
Call RegisterHotKey(Me.hWnd, &HC000&, 0, vbKeyF10) 'vbMinimized
Call RegisterHotKey(Me.hWnd, &HC001&, 0, vbKeyF11) 'vbNormal

'show some information
Me.AutoRedraw = True
Me.Print "按 F9 本窗口便被呼叫,并最大化!" & vbCrLf & "按 F10 本窗口便被呼叫,并最小化!" & vbCrLf & "按 F11 本窗口便被呼叫,并正常化!"
'show the form and
Show
'process the Hotkey messages
ProcessMessages
End Sub
Private Sub Form_Unload(Cancel As Integer)
bCancel = True
'unregister hotkey
Call UnregisterHotKey(Me.hWnd, &HBFFF&)
End Sub
lxcc 2003-03-13
  • 打赏
  • 举报
回复
http://www.25emuhome.com/column/learn/doc/learn011.html
chenggongkou 2003-03-13
  • 打赏
  • 举报
回复
Hook
litsnake1 2003-03-13
  • 打赏
  • 举报
回复
你是不是要热键啊
想ctrl+c一样,那都能用

1,486

社区成员

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

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