回 帖 发 新 帖 刷新版面

主题:VB做的程序没有窗体不行吗?

我做了一个程序,不需要使用窗体,使用了键盘钩子,按键时就调用Beep(不是VB自带的,而是API),根据按键的不同发出不同的声音。

这样的程序是不需要窗体的,所以开始的时候我没有加窗体,但是运行之后马上退出(在任务管理器中一闪即逝)。后来加上一个什么也不做的窗体就好了?

难道没有窗体只用模块不可以吗?

还有一个问题,在钩子的回调函数中,捕捉到按下了Ctrl+Shift+X之后就使用End语句关闭本程序。但是每次按下这个组合键就会windows的错误对话框:
musickeboard。exe遇到问题需要关闭,我们对此造成的不便表示抱歉。。。。。
是不是在回调函数中不能使用End语句?

回复列表 (共7个回复)

沙发

= =; 那还真是短命的程序.

就算用不上窗口,至少也要有个托盘图标吧.
而托盘图标就需要至少一个窗口.

板凳

现在就咱俩醒着么.....

我没想加托盘图标...第一个问题是这样的:如果我非要不使用任何窗体,怎么保持程序运行后不自动退出?

3 楼

感觉应该可以呀。只用sub Main
大致结构如下:
sub main
getKey...'获得按键信息
while not getkey="Ctrl+Shift+X"
   Beep()
wend
end sub

4 楼

3楼,那是在折磨CPU吧?
看看CPU使用率?

5 楼

[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 楼

[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 楼

我该学学windows消息了...

我来回复

您尚未登录,请登录后再回复。点此登录或注册