软件自动还原已经打开的窗口

lsxad 2010-04-07 11:43:33
程序远行后,用户点了窗口右上角最小化后.过了很长时间,用户有时已经忘了打开过程序了,当再次点EXE时可以判断原来的程序是否在远行,如果有在运行的话,可以提示不能重复运行.
If App.PrevInstance = True Then
MsgBox "软件已经运行!"
End
End If
现在的问题是能否在提示完不能重复运行后,软件自动还原已经打开的窗口.是打开过的窗口恢复原来的大小,而不是在最小化的状态.
...全文
133 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
兰穆达 2011-01-27
  • 打赏
  • 举报
回复
.share'共享代码段
Handle dd ?

.code

.if Handle=0
Handle=GetModuleHandle(0)
.elseif
SendMessage(Handle,WM_SYSCOMMAND,SC_RESTROE,0)
ExitProcess(0)
.endif
liguicd 2010-04-09
  • 打赏
  • 举报
回复
帮顶了
嗷嗷叫的老马 2010-04-09
  • 打赏
  • 举报
回复
路过,帮顶.....

我的方案与8楼相同.
舉杯邀明月 2010-04-09
  • 打赏
  • 举报
回复
如果不HOOK :
  第一次启动的为 进程1,
  第二次启动的为 进程2。


进程1 如何知道 进程2 出现了?
东方之珠 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lsxad 的回复:]
有时是FROM1,有时是FORM2
[/Quote]

这个好办。11楼程序中 If AhWnd = Me.hwnd Then 改为:
If AhWnd = Form1.hwnd OR AhWnd = Form2.hwnd  Then'注意AhWnd必须是自己程序的窗口句柄。



东方之珠 2010-04-09
  • 打赏
  • 举报
回复
9楼这个笨办法经测试可行:

Option Explicit
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Const SW_SHOWNORMAL As Long = 1

Dim AhWnd As Long '前台活动窗口句柄
Private Sub Command1_Click()
Unload Me
End Sub

Private Sub Form_Initialize()
Dim FileNumber As Long, Rtn As Long
FileNumber = FreeFile
If App.PrevInstance Then
Open "c:\AhWnd.hwnd" For Binary As #FileNumber
Get #FileNumber, 4, Rtn
Close #FileNumber
MsgBox "软件已经运行!" & "进程一句柄:" & Rtn & " 进程二句柄:" & Me.hwnd
Call ShowWindow(Rtn, SW_SHOWNORMAL)
Unload Me: End
End If
End Sub

Private Sub Form_Load()
Me.Caption = Me.hwnd
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Dim FileNumber As Long
AhWnd = GetForegroundWindow
FileNumber = FreeFile
If AhWnd = Me.hwnd Then
Open "c:\AhWnd.hwnd" For Binary As #FileNumber
Put #FileNumber, 4, AhWnd
Close #FileNumber
Timer1.Enabled = False
End If
End Sub
舉杯邀明月 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lsxad 的回复:]
有时是FROM1,有时是FORM2
[/Quote]
晕……
“1、h = FindWindow(vbNullString, "窗口名称")”指的是窗口标题,当你编译成.exe的之后,它是确定的吧?
难道你还会用动态标题?

要不你就用 HOOK 吧,跟窗口标题无关!
lsxad 2010-04-08
  • 打赏
  • 举报
回复
有时是FROM1,有时是FORM2
xrongzhen 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lsxad 的回复:]
引用 3 楼 lyserver 的回复:
1、h = FindWindow(vbNullString, "窗口名称")
2、SendMessage h, WM_SYSCOMMAND, SC_RESTORE, 0&

如果不知道当前打开了哪个窗口呢
[/Quote]

你写的程序,还不知道窗口名称???
lsxad 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lyserver 的回复:]
1、h = FindWindow(vbNullString, "窗口名称")
2、SendMessage h, WM_SYSCOMMAND, SC_RESTORE, 0&
[/Quote]
如果不知道当前打开了哪个窗口呢
lyserver 2010-04-08
  • 打赏
  • 举报
回复
1、h = FindWindow(vbNullString, "窗口名称")
2、SendMessage h, WM_SYSCOMMAND, SC_RESTORE, 0&
东方之珠 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 lsxad 的回复:]
程序远行后,用户点了窗口右上角最小化后.过了很长时间,用户有时已经忘了打开过程序了,当再次点EXE时可以判断原来的程序是否在远行,如果有在运行的话,可以提示不能重复运行.
If App.PrevInstance = True Then
MsgBox "软件已经运行!"
End
End If
现在的问题是能否在提示完不能重复运行后,软件自动还原已经打开的窗口.是打开过的窗口恢复原来……
[/Quote]
其实,可以简单一点,还可以不用HOOK。在定时器中保存活动窗口的句柄,比如是AhWnd,当你判断完毕发现程序已经运行后,立即执行:ShowWindow AhWnd,SW_SHOWNORMAL,程序将恢复原来的状态,虽然这个方法有点笨,效率有点低,但实用。
threenewbee 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lsxad 的回复:]
引用 3 楼 lyserver 的回复:
1、h = FindWindow(vbNullString, "窗口名称")
2、SendMessage h, WM_SYSCOMMAND, SC_RESTORE, 0&

如果不知道当前打开了哪个窗口呢
[/Quote]
还有个办法。后来的程序发现有程序运行,广播一个 WM_USER 消息,传递一个特定的值。
只有你的程序识别了这个值,然后让原来的程序自己激活自己。
舉杯邀明月 2010-04-08
  • 打赏
  • 举报
回复
Hook.
threenewbee 2010-04-08
  • 打赏
  • 举报
回复
findwindow 找到窗口
FlashWindow 闪烁窗口,或者 bringtofront 打开

7,763

社区成员

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

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