您的位置:程序门 -> vb -> 基础类



app.previnstance    请教 急!!!!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


app.previnstance 请教 急!!!!
发表于:2007-08-31 23:25:22 楼主
我是个菜鸟,请高手指教。我在网上看到的,如果要想不准重复打开程序   就用
if   app.previnstance   then   end   就可以了但是这里却用了中间的一些东西,我不清楚   为什么要用     ,我后来想了一下,作者的目的好象是,当工程运行以后在点击工程图标,让程序不重复打开,并且激活窗体,使窗体从任务栏返回桌面,像“芊芊静听”那样,但是我在运行时却出现错误     请高手     指点……
private   sub   form_load()  
dim   k   as   long  
'不准重复打开这个程序  
dim   title   as   string  
if   app.previnstance   then  
title   =   app.title  
app.title   =   " "  
me.caption   =   " "  
appactivate   title  
end  
end   if  
发表于:2007-09-01 02:07:391楼 得分:0
.......路过
发表于:2007-09-01 09:19:562楼 得分:0
啊,九点了....早上好~~~~我刚起来呢.

看了一下,少了个end   sub,其它好象没事.

然后把格式整理了一下,顺手还写了点注释....

自己看看吧,吃包子去了.....

private   sub   form_load()  
        dim   k   as   long  
        '不准重复打开这个程序  
        dim   title   as   string  

        if   app.previnstance   then       '检测是否已有一个实例
                title   =   app.title             '如果有,那先保存标题
                app.title   =   " "                   '然后清空自己的标题,以免把自己激活了
                me.caption   =   " "  
                appactivate   title             '激活已存在的那个实例
                end                                         '退出工程
        end   if  
end   sub
发表于:2007-09-01 10:50:073楼 得分:0
还没有解决     哭求   高手帮忙!!!!请注意   我的目的是:当工程运行以后在点击工程图标,让程序不重复打开,并且激活窗体,使窗体从任务栏返回桌面,像“芊芊静听”那样,但是我在运行时却出现错误   就是在窗体已经在任务栏了       我在点击桌面图标       就出现了错误!!我想了一天了       都还没有解决     求你们了     555555
发表于:2007-09-01 10:53:004楼 得分:0
如果     我不想让窗体从任务栏返回     桌面     我就不用
title   =   app.title             '
                app.title   =   " "            
                me.caption   =   " "  
                appactivate   title           这几句话了
发表于:2007-09-01 11:06:165楼 得分:0
问题是,我都没有听你说错误在哪里

而且,我发的代码是我自己测试通过的
发表于:2007-09-01 11:09:526楼 得分:0
哦     对不起     是这样的     在和vb一起打开时才出现错误       不好意思   但是不出现错误     问题:   就是在双击桌面图标窗体不能从任务栏返回桌面
发表于:2007-09-01 11:14:187楼 得分:0
这和不要title   =   app.title             '
                app.title   =   " "            
                me.caption   =   " "  
                appactivate   title       这三句话     有什么区别吗     我就是想让     该窗体从任务栏返回
发表于:2007-09-01 11:17:148楼 得分:0
appactivate     函数的代码贴出来
你不要那三句怎么再激活窗体?!
发表于:2007-09-01 11:21:519楼 得分:0
恩     但是   窗体   不能又重任务栏返回桌面     我应该   怎么做?/?       谢谢回答!!
发表于:2007-09-01 13:41:2410楼 得分:0
哦了   明白了你的意思
可是没想起来怎么做..
在想想
发表于:2007-09-02 00:02:0411楼 得分:0
好像,另一个贴子也是你这个问题?
appactivate只是激活,但并不改变窗体状态,还是刚才说的,用showwindow可以。但要先取得hwnd

另外如果exe改个名字以复本运行,app.previnstance是发现不了这个实例的。用findwindow要相对可靠些!且可得到hwnd,前提是你的caption不是动态的。否则,就有些复杂了。
发表于:2007-09-02 00:40:2812楼 得分:0
我晕倒...........

算了,送你个模块.

以下代码保存为 "modgetrun.bas ":

'*************************************************************************
'**模   块   名:modgetrun
'**说         明:禁止运行多个实例,并激活已存在的实例(使用互斥体)
'**创   建   人:马大哈
'**日         期:2006年7月5日
'**描         述:摘于网络
'**版         本:v1.0
'*************************************************************************
option   explicit

private   declare   function   openmutex   lib   "kernel32 "   alias   "openmutexa "   (byval   dwdesiredaccess   as   long,   byval   binherithandle   as   long,   byval   lpname   as   string)   as  

long
 
private   const   standard_rights_required   =   &hf0000
private   const   synchronize   =   &h100000
private   const   mutant_query_state   =   &h1
private   const   mutant_all_access   =   (standard_rights_required   or   synchronize   or   mutant_query_state)
private   const   mutex_all_access   =   mutant_all_access
 
private   const   bsf_ignorecurrenttask   =   &h2
private   const   bsf_postmessage   =   &h10
private   const   bsm_applications   =   &h8
 
private   type   security_attributes
                              nlength     as   long
                              lpsecuritydescriptor     as   long
                              binherithandle     as   long
end   type
 
private   declare   function   createmutex   lib   "kernel32 "   alias   "createmutexa "   (lpmutexattributes   as   security_attributes,   byval   binitialowner   as   long,   byval   lpname  

as   string)   as   long
private   declare   function   registerwindowmessage   lib   "user32 "   alias   "registerwindowmessagea "   (byval   lpstring   as   string)   as   long
private   declare   function   broadcastsystemmessage   lib   "user32 "   (byval   dw   as   long,   pdw   as   long,   byval   un   as   long,   byval   wparam   as   long,   byval   lparam   as   long)   as  

long
 
private   declare   function   closehandle   lib   "kernel32 "   (byval   hobject   as   long)   as   long
 
private   declare   function   showwindow   lib   "user32 "   (byval   hwnd   as   long,   byval   ncmdshow   as   long)   as   long
private   const   sw_hide   =   0
private   const   sw_shownormal   =   1
 
private   declare   function   setforegroundwindow   lib   "user32 "   (byval   hwnd   as   long)   as   long
private   declare   function   getforegroundwindow   lib   "user32 "   ()   as   long
 
private   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
private   declare   function   setwindowlong   lib   "user32 "   alias   "setwindowlonga "   (byval   hwnd   as   long,   byval   nindex   as   long,   byval   dwnewlong   as   long)   as   long
private   declare   function   getwindowlong   lib   "user32 "   alias   "getwindowlonga "   (byval   hwnd   as   long,   byval   nindex   as   long)   as   long
private   const   gwl_wndproc   =   (-4)
 
private   lprevwndproc       as   long                                                                       '前一窗体过程
private   hmutex       as   long                                                                                               '互斥事件句柄
private   windowmsg       as   long                                                                                   '自定义消息
private   sa       as   security_attributes                                                   '安全属性
 
private   const   unique   =   "hisofty "                                                             '自定义消息名
 
public   function   newwindowproc(byval   hwnd   as   long,   byval   umsg   as   long,   _
                                                                                                                      byval   wparam   as   long,   byval   lparam   as   long)   as   long                                               '新窗体过程
        select   case   umsg
                case   windowmsg                                                           '自定义窗体消息处理
                        msgbox   "我已经运行了! ",   vbinformation,   "呵呵,hi_softy "
                        showwindow   hwnd,   sw_shownormal
                        if   getforegroundwindow()   <>   hwnd   then
                                        setforegroundwindow   hwnd
                        end   if
                case   else
                        newwindowproc   =   callwindowproc(lprevwndproc,   hwnd,   umsg,   wparam,   lparam)
        end   select
end   function
 
public   sub   windowhook(byval   hwnd   as   long)                                                       '设置窗体钩子
        lprevwndproc   =   setwindowlong(hwnd,   gwl_wndproc,   addressof   newwindowproc)
end   sub
 
public   sub   unwindowhook(byval   hwnd   as   long)                                                                               '卸载窗体钩子
        if   lprevwndproc   <>   getwindowlong(hwnd,   gwl_wndproc)   then
                setwindowlong   hwnd,   gwl_wndproc,   lprevwndproc
                closehandle   hmutex
        end   if
end   sub
 
public   function   initializefunction(byref   theform   as   form)
        windowmsg   =   registerwindowmessage(unique)
        hmutex   =   openmutex(mutex_all_access,   false,   unique)
        if   hmutex   =   0   then
                hmutex   =   createmutex(sa,   false,   unique)
        else
                broadcastsystemmessage   bsf_ignorecurrenttask   or   bsf_postmessage,   bsm_applications,   windowmsg,   0,   0
                set   theform   =   nothing
                end
        end   if
end   function

***************************************

使用:

窗体load事件里面,作如下调用:

private   sub   form_load()
        windowhook   me.hwnd
end   sub

窗体unload事件里面:

private   sub   form_unload(cancel   as   integer)
        unwindowhook   me.hwnd
end   sub

新添加一个模块,写一个sub   main函数,让工程由此过程启动:

sub   main()
          initializefunction   form1         '你的主窗口
end   sub


快速检索

最新资讯
热门点击