主题:VB做的程序没有窗体不行吗?
singlion
[专家分:690] 发布于 2009-03-14 03:16:00
我做了一个程序,不需要使用窗体,使用了键盘钩子,按键时就调用Beep(不是VB自带的,而是API),根据按键的不同发出不同的声音。
这样的程序是不需要窗体的,所以开始的时候我没有加窗体,但是运行之后马上退出(在任务管理器中一闪即逝)。后来加上一个什么也不做的窗体就好了?
难道没有窗体只用模块不可以吗?
还有一个问题,在钩子的回调函数中,捕捉到按下了Ctrl+Shift+X之后就使用End语句关闭本程序。但是每次按下这个组合键就会windows的错误对话框:
musickeboard。exe遇到问题需要关闭,我们对此造成的不便表示抱歉。。。。。
是不是在回调函数中不能使用End语句?
回复列表 (共7个回复)
沙发
bcahzvip [专家分:6040] 发布于 2009-03-14 03:39:00
= =; 那还真是短命的程序.
就算用不上窗口,至少也要有个托盘图标吧.
而托盘图标就需要至少一个窗口.
板凳
singlion [专家分:690] 发布于 2009-03-14 03:57:00
现在就咱俩醒着么.....
我没想加托盘图标...第一个问题是这样的:如果我非要不使用任何窗体,怎么保持程序运行后不自动退出?
3 楼
天天学习 [专家分:4570] 发布于 2009-03-14 10:43:00
感觉应该可以呀。只用sub Main
大致结构如下:
sub main
getKey...'获得按键信息
while not getkey="Ctrl+Shift+X"
Beep()
wend
end sub
4 楼
bcahzvip [专家分:6040] 发布于 2009-03-14 11:31:00
3楼,那是在折磨CPU吧?
看看CPU使用率?
5 楼
天天学习 [专家分:4570] 发布于 2009-03-14 13:12:00
[quote]3楼,那是在折磨CPU吧?
看看CPU使用率?[/quote]
那倒也是,没真正写代码来试过。
那换成这样呢?
sub Main()
Dim m As MSG
'SetHook
While (GetMessage(m, 0, 0, 0))
TranslateMessage m
DispatchMessage m
Wend
End Sub
[quote]钩子的回调函数中,捕捉到按下了Ctrl+Shift+X之后就使用End语句关闭本程序。但是每次按下这个组合键就会windows的错误对话框[/quote]
会不会是没有卸载掉钩子?没有还原默认的处理函数?
6 楼
tanchuhan [专家分:15140] 发布于 2009-03-14 17:18:00
[quote]
sub Main()
Dim m As MSG
'SetHook
While (GetMessage(m, 0, 0, 0))
TranslateMessage m
DispatchMessage m
Wend
End Sub
[/quote]
如果你的程序没有任何窗口,线程会直接在GetMessage(&msg, NULL, 0, 0)挂起
(因为没有窗口就没有窗口消息,也没有线程消息)
当然不排除你在其它进程或其它线程调用PostThreadMessage唤醒线程.
其实VB里可以不要任何窗体,但这样就需要自己去实现线程消息循环,要我去声明那一大堆函数我晕死才怪.个人认为得不偿失,还不如要一个窗体隐藏起来来得舒服.
楼主的第二个问题估计就像大家所说的那样,没有把之前的一些操作清理.
7 楼
singlion [专家分:690] 发布于 2009-03-14 19:04:00
我该学学windows消息了...
我来回复