标题:后台运行的模拟按键程式如何用热键快速退出
只看楼主
nhhykly9d
Rank: 1
等 级:新手上路
帖 子:30
专家分:5
注 册:2008-1-4
 问题点数:0 回复次数:4 
后台运行的模拟按键程式如何用热键快速退出
我编的VB模拟按键程式是在桌面游戏后面运行。如果我想快速退出模拟按键程式。但我的模拟程式的启动窗口没有焦点,是在桌面游戏后面的,并且我的模拟鼠标与按键一直不断在点击桌面,桌面游戏一直占有焦点,我不能用手动方法获得启动窗口焦点,所以不能停止程式。我现在想用一个热键比如ALT+L ,能使模拟程式立即停止,请提示思路,或赠代码,谢谢!
我的程式结构如下:
Sub  form1-load()....'加上一个button1
End Sub
Sub button1-()       按下button1  '启动模拟程式
模拟程式()
End Sub
Sub 模拟程式()
(鼠标点击桌面循环)
End Sub

form1窗口属性设为top most  在窗口最上面,但在模拟程没结束时,因为鼠标在不停点击,form1窗口不接受焦点,我不能手动关闭它。按键信息它也不能接受?

[[italic] 本帖最后由 nhhykly9d 于 2008-1-4 22:05 编辑 [/italic]]
搜索更多相关主题的帖子: 热键 程式 后台 模拟 运行 
2008-01-04 21:37
dawn4640576
Rank: 1
等 级:新手上路
帖 子:1079
专家分:0
注 册:2007-9-19
得分:0 
[url]http://dev.[/url]

[[italic] 本帖最后由 dawn4640576 于 2008-1-5 09:22 编辑 [/italic]]

我看青山多妩媚料青山看我应如是
2008-01-05 09:12
dawn4640576
Rank: 1
等 级:新手上路
帖 子:1079
专家分:0
注 册:2007-9-19
得分:0 
[url]http://www.q[/url]

[[italic] 本帖最后由 dawn4640576 于 2008-1-5 09:25 编辑 [/italic]]

我看青山多妩媚料青山看我应如是
2008-01-05 09:22
dawn4640576
Rank: 1
等 级:新手上路
帖 子:1079
专家分:0
注 册:2007-9-19
得分:0 
上面把q和qread之间的空格去掉
不知为什么我粘贴的是:[url]http://www.q [/url](去掉q和q这间的空格)这个网址,
发表贴子之后变成:[url]http://www.[/url]这个网址了.
斑主看看是什么原因..

[[italic] 本帖最后由 dawn4640576 于 2008-1-5 09:31 编辑 [/italic]]

我看青山多妩媚料青山看我应如是
2008-01-05 09:27
nhhykly9d
Rank: 1
等 级:新手上路
帖 子:30
专家分:5
注 册:2008-1-4
得分:0 
这个程式在VB6中可行,在VB2005不能运行,望高手修改
 Option Explicit
  
  Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA”_
   (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA”_
   (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  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
  Declare Function RegisterHotKey Lib “user32” (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
  Declare Function UnregisterHotKey Lib “user32” (ByVal hwnd As Long, ByVal id As Long) As Long
  
  Public Const WM_HOTKEY = &H312
  Public Const MOD_ALT = &H1
  Public Const MOD_CONTROL = &H2
  Public Const MOD_SHIFT = &H4
  Public Const GWL_WNDPROC = (-4)
  
  Public preWinProc As Long
  Public Modifiers As Long, uVirtKey As Long, idHotKey As Long
  
  Private Type taLong
   ll As Long
  End Type
  Private Type t2Int
   lWord As Integer
   hword As Integer
  End Type
   Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
  ByVal wParam As Long, ByVal lParam As Long) As Long
   If Msg = WM_HOTKEY Then
   If wParam = idHotKey Then
   Dim lp As taLong, i2 As t2Int
   lp.ll = lParam
   LSet i2 = lp
   If (i2.lWord = Modifiers) And i2.hword = uVirtKey Then
   Debug.Print “HotKey Shift-Alt-G Pressed ”
   Shell “notepad”, vbNormalFocus
   End If
   End If
   End If
   注释:如果不是热键信息则调用原来的程序
   wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
   End Function
  
  注释:以下程序放在窗体中
  Sub Form_Load()
   Dim ret As Long
   注释:记录原来的window程序地址
   preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
   注释:用自定义程序代替原来的window程序
   ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
'##这里报错,AddressOf  应加上委托,但我不知么样加

   idHotKey = 1 注释:in the range &h0000 through &hBFFF
   Modifiers = MOD_ALT + MOD_SHIFT
   uVirtKey = vbKeyG
   注释:注册热键
   ret =RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
   End Sub
  
   Private Sub Form_Unload(Cancel As Integer)
   Dim ret As Long
   注释:取消Message的截取,使之送往原来的window程序
   ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
   Call UnregisterHotKey(Me.hwnd, uVirtKey)
   End Sub



这个程式在VB6可以通过,但在VB2005中报错,有二个地方出错,请高手过目修改一下:
 一,     ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
'##这里报错,AddressOf  应加上委托,但我不知么样加
二,
   LSet i2 = lp
不同类型不能转换
2008-01-05 16:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-195931-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.398482 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved