请各位大侠帮忙,关于画面控制的技巧

bfswyh 2003-12-30 03:19:13
我有一个vb程序在form_load函数里面加了如下代码:
If App.PrevInstance = True Then
Me.Show
End
End If
这段代码的作用就是防止一个程序在一台机器上的重复启动。但是现在我有一个问题:编译成exe文件的程序对于重复启动的防止控制得很好,但是当我再次双击exe文件的时候,我希望不仅仅是防止重复启动,我还希望已经启动的程序(非当前活动窗口状态)能够显示到画面前端来(自动变成当前活动窗口状态),请各位不吝赐教实现方法。
...全文
33 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
firechun 2003-12-31
  • 打赏
  • 举报
回复
FindWindow的声明改成:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As String) As Long
*******注意第一个参数声明的类型*******
调用时:FindWindow(0&,"Form1"),不需要给ClassName,因为很多时候你并不知道ClassName
用ShowWindow有时并不能将窗口置于最前
下面是我的代码:

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long


Const SW_SHOW = 5
Const SW_RESTORE = 9


Private Sub Form_Load()
Dim hWnd As Long
If App.PrevInstance Then
Me.Caption = "" '避免窗口Caption重复
hWnd = FindWindow(0&, "Form1")
ForceForegroundWindow hWnd
End
End If
Label1.Caption = Me.hWnd

End Sub

Private Function ForceForegroundWindow(ByVal hWnd As Long) As Boolean
Dim ThreadID1 As Long
Dim ThreadID2 As Long
Dim nRet As Long

If hWnd = GetForegroundWindow() Then
ForceForegroundWindow = True
Else

ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&)
ThreadID2 = GetWindowThreadProcessId(hWnd, ByVal 0&)

If ThreadID1 <> ThreadID2 Then
Call AttachThreadInput(ThreadID1, ThreadID2, True)
nRet = SetForegroundWindow(hWnd)
Call AttachThreadInput(ThreadID1, ThreadID2, False)
Else
nRet = SetForegroundWindow(hWnd)
End If

If IsIconic(hWnd) Then
Call ShowWindow(hWnd, SW_RESTORE)
Else
Call ShowWindow(hWnd, SW_SHOW)
End If

ForceForegroundWindow = CBool(nRet)
End If
End Function



danielinbiti 2003-12-31
  • 打赏
  • 举报
回复
api:
setforegroundwindow
bfswyh 2003-12-31
  • 打赏
  • 举报
回复
先谢谢楼上。但是这里有一个问题:FindWindow("", "form2"),经我测试,发现好像如果不写类名称,只写form名称是不能找到窗口的,返回值永远是0。所以在执行exe文件时必须写为FindWindow("ThunderRT6FormDC", "form2")形式,在vb6IDE调试中必须写为FindWindow("ThunderFormDC", "form2")形式才可以找到,不知道是否必须如此。另外,可能我写的有问题,目前还是无法实现同时具备防止多重启动和让已经启动的但是处于非活动状态的程序,直接变成当前活动状态。我在form_load里面讲代码改成了如下形式:
If App.PrevInstance = True Then
Call ShowWindow(FindWindow("ThunderRT6FormDC", "MessageBox Style Viewer"), 9)
End
End If

请各位大虾指点一二,如何才能实现既防止多重启动,又能够将已经运行的非活动状态下的程序变成当前活动状态。
xingkong1982 2003-12-31
  • 打赏
  • 举报
回复
我认为可以将if……then 结构更改为if……then……else 结构,在then语句中加入判断语句,然后找出已经打开的窗口并激活即可。
leolan 2003-12-31
  • 打赏
  • 举报
回复
這是API函數:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function SetActiveWindow Lib "user32" Alias "SetActiveWindow" (ByVal hwnd As Long) As Long

Private Sub Command1_Click()
Dim l_hwnd As Long

l_hwnd = FindWindow("", "form2")
l_hwnd = SetActiveWindow(l_hwnd)
End Sub
bfswyh 2003-12-31
  • 打赏
  • 举报
回复
请指点得详细些,我在vb6里面找不到FindWindow和SetActiveWindow函数啊,请给出一个简单的例子好吗??
bfswyh 2003-12-31
  • 打赏
  • 举报
回复
谢谢各位的热心帮助,尤其是天火兄弟。问题解决了!
Wit253 2003-12-30
  • 打赏
  • 举报
回复
找出原来窗口[FindWindow]并激活它[SetActiveWindow]

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧