vb怎么将vb点不到小程序代码附加到 外部vb点不到小程序代码上

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
学会时间管理,学会控制自己!!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
首先,说一下我想实现的效果【目标】1、运行我的程序,可以通过我的程序打开和关闭该外部软件。2、可以使用我的程序控制外部软件的按键点击、可以控制文本框的文本写入和读取。(其实看起来很简单,还是搞了我两天时间啊……)其次,说一下我的方案和过程【方法】 方法一:使用按键精灵模拟鼠标的点击事件,然后通过VB的sendkeys()函数发送按键精灵的快捷键实现点击 1、启动软件:这个有两种方法,大家都应该知道,函数有shell,该函数专门用来打开外部软件的;另外一个是API函数WinExeC。这两个都能达到启动的效果,所以启动是很简单的。'例程Shell returnvalue = Shell("C:\Program Files\DekTec\StreamXpress\StreamXpress.exe", 1)'返回该软件的任务ID AppActivate returnvalue'激活该软件'例程WinExeCDeclare Function WinExec Lib "kernel32" Alias "WinExec" (ByVal lpCmdLine AsString, ByVal nCmdShow As Long) As Longlngtemp = WinExec("C:\Program Files\DekTec\StreamXpress\StreamXpress.exe", 2)'返回值&32表示打开成功 2、移动窗体:因为只是使用按键精灵模拟鼠标点击,所以必须固定窗体的位置,否则没有效果,或者点击到其他位置,固定窗体的位置我用的是API函数MoveWindow(当然还有其他函数),将被控软件窗体移动到左上角。在需要移动窗体的过程中必须获取窗体的句柄,这里使用API函数FindWindow来获取窗体的句柄。例程如下:(前面这些可是一帆风顺啊,哈哈)Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPublic Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As LongPublic Type RECT
Left As Long
Top As Long
Right As Long
Bottom As LongEnd TypeDeclare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As LonghWnd = FindWindow(vbNullString, "DekTec StreamXpress - Transport-Stream Player")'获取窗体句柄If hWnd = 0 Then
MsgBox "窗体DekTec StreamXpress Transport-Stream Player未找到"
Exit SubEnd IfGetWindowRect hWnd, RECT'获取窗体的尺寸,方便移动窗体temp = MoveWindow(hWnd, 0, 0, RECT.Right - RECT.Left, RECT.Bottom - RECT.Top, 1)If temp = 0 Then MsgBox "Move failed!" 3、制作按键精灵鼠标点击:就是写一个单击按键的脚本,设置其快捷键方式:Alt+F10(这个要不常用,不让每次都响应按键精灵去了),上图:&就这个,够简单吧……,在键盘上试了试,OK,没问题……然而悲剧才刚刚开始插一脚:这里说一个简单的获取要点击位置的方法,我看了一些很多的方法,觉得这个是最简便的,调用API的GetCursorPos函数,用鼠标指向需要点击的地方就直接获取了这一点的位置。代码如下:Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPublic Type POINTAPI
y As LongEnd TypePrivate Sub Timer1_Timer()‘注意要用到timer控件哈& & Dim cursorp As POINTAPI& & GetCursorPos cursorp& & Text1 = cursorp.x & "," & cursorp.yEnd Sub 4、接下来就是使用我的程序发送快捷键了,这个简单,使用sendkeys函数即可,以前使用过,代码如下SendKeys "+{F10}"这里出问题了……不管怎么搞,按键精灵就是一点响应也没有,去问了一些人,说是按键精灵设置的原因,按键精灵有普通模式、硬件模式和超级模式,一般选择超级模式就搞定了,我就找到修改了然后还是不行,最后我把快捷键设置成了一个字母就OK了,但是这会影响到其他输入……一头雾水,到现在都没弄明白。但是也因为这个原因促使我想其他方法,现在想想要用按键精灵,以后还要确保它被开启才能使用程序,也怪麻烦的,直接一个程序不加其他东西最好方法二:使用FindWindowEx和SendMessage配合完成外部控件的控制+SPY++工具上面的方法没行通,只有换方法了,我们已经从上面的方法中获取了主窗体的句柄,要控制里面的控件,就需要获取控件的句柄,通过函数 FindWindowEx就可以获取控件的句柄,于是开始动手写代码了(关于 FindWindowEx&的介绍我空间里有)Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Longhtxt0 = FindWindowEx(hWnd, 0, "Edit", vbNullString)这里 FindWindowEx需要的参数有顶级窗体句柄(已获取),子窗体句柄(就是从这个句柄后查找下一个句柄,为0表示从第一个开始),lpsz1表示类名(即控件的类名),lpsz2是一样的。&FindWindowEx&我们一般的使用方法是如果知道标题名(如按钮“确定”),直接使用即可,如下hbtn=FindWindowEx(hwnd,0,vbNullString,"确定") 但是我们这里按键是图形按钮,所以不能使用上面直接给出标题名的查找方法,只能通过类名进行查找,我要查找一个按钮 控件的句柄,写了如下代码hbtn = FindWindowEx(hWnd, 0, "ThunderRT6CommandButton", vbNullString) 这个地方获取的句柄始终是0,也就是获取失败,这是什么原因呢?我查询了一些资料,发现因为我们不知到其他软件的编程工具是什么,所以就不能知道它控件的类名,这里也就是说类名是错误的。那类名如何获取呢?这里我就要隆重的推出一块强大的小工具了Spy++,许多写过窗体的控制的朋友都知道的& 这里我们可以看到这个软件能直接获取各控件的类名和句柄,这个软件的设计过程我已转到控件,可以看一下,很有帮组的。获取了句柄和类名后就可以看是写程序了htxt0 = FindWindowEx(hWnd, 0, "Edit", vbNullString)htxt1 = FindWindowEx(hWnd, htxt0, "Edit", vbNullString)htxt2 = FindWindowEx(hWnd, htxt1, "Edit", vbNullString)htxt3 = FindWindowEx(hWnd, htxt2, "Edit", vbNullString)htxt4 = FindWindowEx(hWnd, htxt3, "Edit", vbNullString)htxt5 = FindWindowEx(hWnd, htxt4, "Edit", vbNullString)这是一个text控件的获取,这里我可以循环获取然后比较句柄值,同spy++获取的一样就是我们要找的控件了(目前我只知道没有标题名的控件只有这种方法,其他还没了解过),需要注意的是这个时候需要控制的软件不能关闭重新打开,因为这样句柄就变了,但是一旦找到是哪个控件,这个就不受限制了。OK控件的句柄我们已经获取到了,我们可以随意操控它了…… 3.强大的SendMessage函数 API中有一个SendMessage的函数,它是一个非常强大的函数,它可以给windows系统发送许多命令,然后操控系统中的一些东西,我们这里需要发送的就是控制按键和文本的命令(具体函数的详解空间里有)Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const WM_LBUTTONDOWN = &H201Public Const WM_LBUTTONUP = &H202Public Const WM_GETTEXT = &HDPublic Const WM_SETTEXT = &HCPublic Const WM_GETTEXTLENGTH = &HEDim bytSend(3) As BytebytSend(0) = &H35bytSend(1) = &H30bytSend(2) = &H30SendMessage htxt, WM_SETTEXT, 0, bytSend(0)'发送字符数组到文本控件slen = SendMessageByString(htxt, WM_GETTEXT, 255, ByVal gets)'接收文本控件里的数据,返回到gets里注意:这里要注意传送文本到文本控件时使用的是字符数组发送,而不是字符串,字符串发送会出现非法字符。方法三:Mouse_event的使用mouse_event函数是一个API函数,它模拟了我们鼠标的动作,因为采用sendmessage方法我控制的按键太多需要获取太多的句柄比较麻烦,于是采用函数mouse_event,仅仅需要知道鼠标要点击的位置就可以了,而前面我说了getcursorpos函数能很好的获取坐标值,所以相比这个更好用一些,写了如下代码Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)Public Const MOUSEEVENTF_ABSOLUTE = &H8000 ' &absolute movePublic Const MOUSEEVENTF_LEFTDOWN = &H2 ' &left button downPublic Const MOUSEEVENTF_LEFTUP = &H4 ' &left button upPublic Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' &middle button downPublic Const MOUSEEVENTF_MIDDLEUP = &H40 ' &middle button upPublic Const MOUSEEVENTF_MOVE = &H1 ' &mouse movePublic Const MOUSEEVENTF_RIGHTDOWN = &H8 ' &right button downPublic Const MOUSEEVENTF_RIGHTUP = &H10 ' &right button upPublic Const MOUSETRAILS = 39mouse_event MOUSEEVENTF_LEFTDOWN, RECT.Left + 23, RECT.Top + 458, 0, 0mouse_event MOUSEEVENTF_LEFTUP, RECT.Left + 23, RECT.Top + 458, 0, 0结果鼠标是有单击动作,但是只是在原点即鼠标点单击,查了一些资料没能解决,想到它仅仅就是在鼠标指向点点击,何不将鼠标移到要点击的地方,然后通过,点击鼠标的位置达到点击效果呢,于是改变方法写了以下代码,使用SetCursorPos函数把鼠标移动到要点击的点Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As LongSetCursorPos 23, 458mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0mouse_event MOUSEEVENTF_LEFTUP Or MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0OK!问题解决,当然这里的鼠标位置可以自己通过其他动态设定最好【参考网址】 &
阅读(9507)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'VB控制外部程序(原创)',
blogAbstract:'最近要写一个程序,用来控制外部一个软件的设置等等,网上收集了许多资料,自己经过尝试得出了想要的效果,这里把我这两天学到的和理解的贴出来,让以后的要做类似东西的朋友少一些弯路。首先,说一下我想实现的效果【目标】1、运行我的程序,可以通过我的程序打开和关闭该外部软件。2、可以使用我的程序控制外部软件的按键点击、可以控制文本框的文本写入和读取。(其实看起来很简单,还是搞了我两天时间啊……',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:9,
permalink:'blog/static/',
commentCount:5,
mainCommentCount:5,
recommendCount:5,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'学会时间管理,学会控制自己!!',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}雷速体育发帖软件开发QQ
欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 2975 人关注过本帖
标题:如何用VB关闭其他应用程序
等 级:新手上路
帖 子:19
结帖率:100%
&&已结贴√
&&问题点数:20&&回复次数:11&&&
如何用VB关闭其他应用程序
&&& 我用Shell打开了一个其他的应用程序,请问如何在关闭窗口时关闭这个应用程序?
等 级:贵宾
威 望:86
帖 子:908
专家分:5237
&&得分:10&
你可以使用API函数FindWindow和PostMessage来寻找一个窗口并且关闭它。下面的范例演示如何关闭一个标题为&Calculator&的窗口。
程序代码:'下面的代码放到模块中
Declare Function FindWindow Lib &user32& Alias &FindWindowA& (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'FindWindowAPI函数
Declare Function PostMessage Lib &user32& Alias &PostMessageA& (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 'PostMessageAPI函数
Public Const WM_CLOSE = &H10 '常用变量定义
Dim winHwnd As Long '定义一个长整形变量winHwnd
Dim RetVal As Long '定义一个长整形变量RetVal
winHwnd = FindWindow(vbNullString, &Calculator&) 'API函数查找&Calculator&这个窗口
Debug.Print winHwnd '显示这个窗口句柄
If winHwnd && <font color=# Then '如不为0,表示找到窗口
RetVal = PostMessage(winHwnd, WM_CLOSE, <font color=#&, <font color=#&) '向这个窗口发送关闭信息
If RetVal = <font color=# Then '如果返回信息为0.表示失败,未发送成功
MsgBox &Error posting message.& '提示发送失败
MsgBox &The Calculator is not open.& '提示没有找到打开的程序
等 级:版主
威 望:209
帖 子:4201
专家分:25771
&&得分:10&
你用 Shell ,那就继续用 Shell&&吧
有一个命令是 :taskkill ,用这命令直接结束进程吧。
如果第一次调用 Shell 时,保留了 pid ,那就就 pid 参数,防止结束错了,否则就只能用 映像 名了。
--------------
taskkill是用来终止进程的。具体的命令规则如下:
TASKKILL [/S [/U [/P []]]]
{ [/FI ] [/PID | /IM ] } [/F] [/T]
这个命令行工具可用来结束至少一个进程。
可以根据进程 id 或图像名来结束进程。
/S system 指定要连接到的远程系统。
/U [domain\]user 指定应该在哪个用户上下文
执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果忽略,提示输入。
/F 指定要强行终止的进程。
/FI filter 指定筛选进或筛选出查询的的任务。
/PID process id 指定要终止的进程的PID。
/IM image name 指定要终止的进程的图像名。通配符 '*'可用来指定所有图像名。
/T Tree kill: 终止指定的进程和任何由此启动的子进程。
/? 显示帮助/用法。
筛选器名 有效运算符 有效值
----------- --------------- --------------
STATUS eq, ne 运行 | 没有响应
IMAGENAME eq, ne 图像名
PID eq, ne, gt, lt, ge, le PID 值
SESSION eq, ne, gt, lt, ge, le 会话编号
CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
hh:mm:ss。
mm - 钟,ss - 秒
MEMUSAGE eq, ne, gt, lt, ge, le 内存使用,单位为 KB
USERNAME eq, ne 用户名,格式为
[domain\]user
MODULES eq, ne DLL 名
SERVICES eq, ne 服务名
WINDOWTITLE eq, ne 窗口标题
注意: 只有带有筛选器的情况下,才能跟 /IM 切换使用通配符 '*'。
注意: 远程进程总是要强行终止,
不管是否指定了 /F 选项。
授人于鱼,不如授人于渔
早已停用QQ了
等 级:新手上路
帖 子:19
回复 2楼 xiangyue0510
谢谢,可以用,请问有没有使用“对话框”或其他方法,自己选择关闭某一程序的方法?
[此贴子已经被作者于 12:18编辑过]
等 级:新手上路
帖 子:19
回复 3楼 风吹过b
谢谢,只是我没看懂,请问能具体点吗?我在百度上找到这个,只是好像不可以。&&&Shell &Tskill 应用程序.exe&&&&
[此贴子已经被作者于 12:07编辑过]
等 级:贵宾
威 望:86
帖 子:908
专家分:5237
回复 4楼 古123
你的意思是类似于任务管理器那样的?
那你需要遍历系统进程,参考以下代码
http://bbs.csdn.net/topics/
等 级:版主
威 望:209
帖 子:4201
专家分:25771
程序代码:Option Explicit
Dim pid As Long&&&&&&&&&&&&'保存进程PID
Private Sub Command1_Click()
'打开记事本,保存pid
pid = Shell(&notepad.exe&, vbNormalFocus)
Private Sub Command2_Click()
'关闭自己打开的记事本,使用 pid
Shell &taskkill /pid & & pid, vbHide
vb6 测试通过。
授人于鱼,不如授人于渔
早已停用QQ了
等 级:新手上路
帖 子:19
回复 6楼 xiangyue0510
等 级:新手上路
帖 子:19
回复 7楼 风吹过b
谢谢,可以用,但是我刚才试了一下,只能定义pid,定义其他可以打开,但无法关掉。且在一个窗体里打开多个应用程序时,只能关闭最后一个程序。
等 级:版主
威 望:209
帖 子:4201
专家分:25771
你可以定义一个数组 保存每次的 pid ,然后依次调用 这个进行结束进程。
我例子,保存一个,当然只有一个。
授人于鱼,不如授人于渔
早已停用QQ了
版权所有,并保留所有权利。
Powered by , Processed in 0.248600 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved& 1.如何不用将exe程序拷贝到UGII目录下运行? 答:在调用NX Open命令函数前,将当前目录移动到NX安装目录\UGII\,NX安装目录必须和环境变量UGII_BASE_DIR的值一致,否则报错。可以使用如下代码: Dim instalDir As String = Environment.GetEnvironmentVariable("UGII_BASE_DIR")
System.IO.Directory.SetCurrentDirectory(instalDir)
2.我的外部程序很小,不想打包NX的.NET库文件一起发布,而是使用用户的库文件,要怎样做呢?
答:第一步,显示项目所有文件,展开Application.myapp文件,再打开Application.Designer.vb文件,为MyApplication添加Startup事件回调函数,在里面添加如下代码:
Dim ufdir As String = Environment.GetEnvironmentVariable("UGII_BASE_DIR")
Reflection.Assembly.LoadFrom(IO.Path.Combine(ufdir, "\UGII\managed\NXOpen.dll"))
Reflection.Assembly.LoadFrom(IO.Path.Combine(ufdir, "\UGII\managed\NXOpen.UF.dll"))
Reflection.Assembly.LoadFrom(IO.Path.Combine(ufdir, "\UGII\managed\NXOpen.Utilities.dll"))
第二步,修改程序运行配置文件:你的exe程序文件名.config
&?xml version="1.0" encoding="utf-8" ?&
&configuration&
&assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"&
&dependentAssembly&
&assemblyIdentity name="NXOpen"
culture="neutral" publicKeyToken="null"/&
&codeBase version="8.0.2.2" href="FILE://D:\Program Files\Siemens\NX 8.0\UGII\managed\NXOpen.dll"/&
&/dependentAssembly&
&dependentAssembly&
&assemblyIdentity name="NXOpen.UF"
culture="neutral" publicKeyToken="null"/&
&codeBase version="8.0.2.2" href="FILE://D:\Program Files\Siemens\NX 8.0\UGII\managed\NXOpen.UF.dll"/&
&/dependentAssembly&
&dependentAssembly&
&assemblyIdentity name="NXOpen.Utilities"
culture="neutral" publicKeyToken="null"/&
&codeBase version="4.0.0.0" href="FILE://D:\Program Files\Siemens\NX 8.0\UGII\managed\NXOpen.Utilities.dll"/&
&/dependentAssembly&
&/assemblyBinding&
&/runtime&
&/configuration&
阅读(...) 评论()VB如何实现:隐藏外部程序窗口_百度知道
VB如何实现:隐藏外部程序窗口
我想用VB,实现
隐藏外部程序窗口。不是最小化,是隐藏。
首先:获取窗口句柄。代码如下////
Private Declare Function GetForegroundWindow Lib &user32& () As Long
Private Declare Function GetWindowText Lib &user32& Alias &GetWindowTextA& (...
我有更好的答案
添加一个窗体:窗体代码:Option ExplicitPrivate Sub Form_Load()&#39;设置窗体过程SetWindowHook Me.hWndEnd SubPrivate Sub Form_Unload(Cancel As Integer)&#39;取消窗体过程。DelWindowHookEnd Sub添加一个模块,模块代码:Option ExplicitPrivate Declare Function ShowWindow Lib &user32& _(ByVal hWnd As Long, ByVal nCmdShow As Long) As LongPrivate Declare Function SetWindowLong Lib &user32& _Alias &SetWindowLongA& (ByVal hWnd As Long, ByVal nIndex As Long, _ByVal dwNewLong As Long) As LongPrivate 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 LongPrivate Declare Function RegisterHotKey Lib &user32& _(ByVal hWnd As Long, ByVal id As Long, _ByVal fsModifiers As Long, ByVal vk As Long) As LongPrivate Declare Function UnregisterHotKey Lib &user32& _(ByVal hWnd As Long, ByVal id As Long) As LongPrivate Declare Function GetWindowText Lib &user32& Alias &GetWindowTextA& _(ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Declare Function GetClassName Lib &user32& Alias &GetClassNameA& _(ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As LongPrivate Declare Function GetForegroundWindow Lib &user32& () As LongPrivate Const GWL_WNDPROC = (-4)Private Const WM_HOTKEY = &H312Private Const VK_F7 = &H76Dim hPrevWndProc As Long
&#39;原先的窗口过程。Dim hPrevHandle As Long
&#39;原先的窗口句柄。Dim hHotKey As Long
&#39;热键句柄。Dim hH As Long
&#39;隐藏的窗口句柄。Private Function GetClassNameStr(ByVal hWnd As Long) As String&#39;获取窗体的类名。Dim TempStr As String, Rc As LongConst NAME_MAX_LEN = 256TempStr = Space(NAME_MAX_LEN)Rc = GetClassName(hWnd, TempStr, NAME_MAX_LEN)GetClassNameStr = StrConv(LeftB$(StrConv(TempStr, _vbFromUnicode), Rc), vbUnicode)End FunctionPrivate Function GetWindowTextStr(ByVal hWnd As Long) As String&#39;获取窗体标题。Dim TempStr As String, Rc As LongConst NAME_MAX_LEN = 256TempStr = Space(NAME_MAX_LEN)Rc = GetWindowText(hWnd, TempStr, NAME_MAX_LEN)GetWindowTextStr = StrConv(LeftB$(StrConv(TempStr, _vbFromUnicode), Rc), vbUnicode)End FunctionPrivate Function WindowProc(ByVal hWnd As Long, _ByVal uMsg As Long, ByVal wParam As Long, _ByVal lParam As Long) As Long&#39;新的窗口过程。Dim hNowWindow As LongIf uMsg = WM_HOTKEY And wParam = 101 Then&#39;如果按下了指定热键。hNowWindow = GetForegroundWindow()If GetClassNameStr(hNowWindow) = &Notepad& _And GetWindowTextStr(hNowWindow) = _&无标题 - 记事本& And hH = 0 Then&#39;如果当前的活动窗口是无标题记事本。&#39;隐藏窗体。hH = hNowWindowShowWindow hH, 0ElseIf hH && 0 Then&#39;显示窗体ShowWindow hH, 5hH = 0End IfEnd If&#39;调用原有的窗体过程。WindowProc = CallWindowProc(hPrevWndProc, _hWnd, uMsg, wParam, lParam)End FunctionPublic Sub SetWindowHook(ByVal hWnd As Long)&#39;设置新的窗口过程。hPrevHandle = hWndhPrevWndProc = SetWindowLong _(hPrevHandle, GWL_WNDPROC, AddressOf WindowProc)&#39;设置热键(F7)。hHotKey = RegisterHotKey(hPrevHandle, 101, 0, VK_F7)End SubPublic Sub DelWindowHook()&#39;恢复原有的窗口过程。SetWindowLong hPrevHandle, GWL_WNDPROC, hPrevWndProc&#39;取消热键UnregisterHotKey hPrevHandle, hHotKeyEnd Sub
添加一个窗体:窗体代码:Option ExplicitPrivate Sub Form_Load()&#39;设置窗体过程SetWindowHook Me.hWndEnd SubPrivate Sub Form_Unload(Cancel As Integer)&#39;取消窗体过程。DelWindowHookEnd Sub添加一个模块,模块代码:Option ExplicitPrivate Declare Function ShowWindow Lib &user32& _(ByVal hWnd As Long, ByVal nCmdShow As Long) As LongPrivate Declare Function SetWindowLong Lib &user32& _Alias &SetWindowLongA& (ByVal hWnd As Long, ByVal nIndex As Long, _ByVal dwNewLong As Long) As LongPrivate 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 LongPrivate Declare Function RegisterHotKey Lib &user32& _(ByVal hWnd As Long, ByVal id As Long, _ByVal fsModifiers As Long, ByVal vk As Long) As LongPrivate Declare Function UnregisterHotKey Lib &user32& _(ByVal hWnd As Long, ByVal id As Long) As LongPrivate Declare Function GetWindowText Lib &user32& Alias &GetWindowTextA& _(ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Declare Function GetClassName Lib &user32& Alias &GetClassNameA& _(ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As LongPrivate Declare Function GetForegroundWindow Lib &user32& () As LongPrivate Const GWL_WNDPROC = (-4)Private Const WM_HOTKEY = &H312Private Const VK_F7 = &H76Dim hPrevWndProc As Long
&#39;原先的窗口过程。Dim hPrevHandle As Long
&#39;原先的窗口句柄。Dim hHotKey As Long
&#39;热键句柄。Dim hH As Long
&#39;隐藏的窗口句柄。Private Function GetClassNameStr(ByVal hWnd As Long) As String&#39;获取窗体的类名。Dim TempStr As String, Rc As LongConst NAME_MAX_LEN = 256TempStr = Space(NAME_MAX_LEN)Rc = GetClassName(hWnd, TempStr, NAME_MAX_LEN)GetClassNameStr = StrConv(LeftB$(StrConv(TempStr, _vbFromUnicode), Rc), vbUnicode)End FunctionPrivate Function GetWindowTextStr(ByVal hWnd As Long) As String&#39;获取窗体标题。Dim TempStr As String, Rc As LongConst NAME_MAX_LEN = 256TempStr = Space(NAME_MAX_LEN)Rc = GetWindowText(hWnd, TempStr, NAME_MAX_LEN)GetWindowTextStr = StrConv(LeftB$(StrConv(TempStr, _vbFromUnicode), Rc), vbUnicode)End FunctionPrivate Function WindowProc(ByVal hWnd As Long, _ByVal uMsg As Long, ByVal wParam As Long, _ByVal lParam As Long) As Long&#39;新的窗口过程。Dim hNowWindow As LongIf uMsg = WM_HOTKEY And wParam = 101 Then&#39;如果按下了指定热键。hNowWindow = GetForegroundWindow()If GetClassNameStr(hNowWindow) = &Notepad& _And GetWindowTextStr(hNowWindow) = _&无标题 - 记事本& And hH = 0 Then&#39;如果当前的活动窗口是无标题记事本。&#39;隐藏窗体。hH = hNowWindowShowWindow hH, 0ElseIf hH && 0 Then&#39;显示窗体ShowWindow hH, 5hH = 0End IfEnd If&#39;调用原有的窗体过程。WindowProc = CallWindowProc(hPrevWndProc, _hWnd, uMsg, wParam, lParam)End FunctionPublic Sub SetWindowHook(ByVal hWnd As Long)&#39;设置新的窗口过程。hPrevHandle = hWndhPrevWndProc = SetWindowLong _(hPrevHandle, GWL_WNDPROC, AddressOf WindowProc)&#39;设置热键(F7)。hHotKey = RegisterHotKey(hPrevHandle, 101, 0, VK_F7)End SubPublic Sub DelWindowHook()&#39;恢复原有的窗口过程。SetWindowLong hPrevHandle, GWL_WNDPROC, hPrevWndProc&#39;取消热键UnregisterHotKey hPrevHandle, hHotKeyEnd Sub
有错误提示
会不会是你操作错了,我调试运行没有问题啊,编译器也没有报错。先运行你的程序,然后打开一个记事本程序,保证记事本为当前活动窗口时,按一下F7就可以隐藏了,再按一下F7又显示了。
本回答被网友采纳
ShowWindow 的参数是 窗口句柄 和 布尔值(真---显示窗口,假---隐藏窗口)。ShowWindow Jubing, 0就可以了。
加在这句之前:GetWindowText Jubing, BiaoTi, 256参数里面的0如果不行就换成vb里面的“假”。
Private Sub Form_Load()Me.HideEnd Sub
你需要的在这个程序里都能找到
其他2条回答
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 vs调试怎么附加到程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信