English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

這個問題很多軟體都可以看得到
可以看到的有MSN
除非你用外掛,否則無法同時開兩個以上的視窗
不曉得在VB中我們該怎麼達到這個效果對於自己寫的程式
也就是限制該程式只有一個Instance在系統內

2007-03-01 15:45:00 · 5 個解答 · 發問者 Anonymous in 電腦與網際網路 程式設計

Ted Wang的好像不符合需求

阿國仔的方法符合需求
但是將程式改名字後還是逃不了雙開的命運!
我試過了MSN的程序
將其改名後它仍舊能保持只有一個Instance在系統中

2007-03-01 18:24:26 · update #1

最後的請求
我記得有個WINDOWS API可以根據Form1.Caption部份去抓到此程式視窗的handle(HWND)
如果有誰還記得的話能否回答一下
例如:小算盤程式
HWND hwnd=?????????("小算盤");
然後有了hwnd就可以對小算盤程式的視窗做操作

2007-03-02 11:12:00 · update #2

5 個解答


當程式啟動時可在登錄檔建立一的標記,或是在某個地方產生一個暫存檔,以檢查此標記或暫存檔是否存在來決定程式是否執行。
例如在程式啟動時:
If Dir(C:\Temp.tmp)="" Then
Open C:\Temp.tmp For Output As #1
Close #1
Else
End
End If

在程式結束前時把Temp.tmp刪除
Kill C:\Temp.tmp


2007-03-02 17:25:40 補充:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Hwnd=FindWindow (vbNullString,"小算盤")

2007-03-01 21:21:08 · answer #1 · answered by W.J.S. 7 · 0 0

利用Mutex來達成功能,這是我看過的一個很有效的解決方法,如果是.NET的話可以直接使用,VB 6的話可以利用API來達成。


http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=1193447&SiteID=14

2007-03-02 04:47:04 · answer #2 · answered by Phoenix 5 · 0 0

先説明,我VB不熟,VB.NET有接觸過,C++,C#碰多一點
其關鍵在於process module

一般可執行程式都有相關的版本資料,如產品名稱,版本號,公司名稱等
這些都可以經由查看檔案内容來獲知

以VB.NET為例
每個Process的Main Module裏含有FileVersionInfo
Process.MainModule.FileVersionInfo
可以得知執行檔的檔案内容,包含ProductName,ProductVersion,甚至是多國語言版的版本

做法:
先判斷是否為Previous Instance,如果不是,那就必須逐一檢查其他 Process(可使用Process.GetProcesses 取得所有的Process)

1 可以簡單的只檢查Process 主視窗(MainWindow) title

2 精確的比對FileVersionInfo的内容,如產品名稱(ProductName),如果要求精確,可再加上版本號及語言版本

2007-03-01 20:53:17 · answer #3 · answered by OriginRain 4 · 0 0

在應用程式的主表單載入時作以下的判斷,若程式已在執行中,即載出表單。
Private Sub Form_Load()

If App.PrevInstance Then
Unload Me
End if

End Sub

2007-03-01 17:26:13 · answer #4 · answered by ? 5 · 0 0

1.在form_load裡面呼叫這個 CheckExist
2."換成雙引號,奇摩會轉碼

Private Sub Form_Load()
Call CheckExist(Me)
End Sub

Public Sub CheckExist(fm As Form)
Dim title As String
If App.PrevInstance Then
title = App.title
App.title = "" //如此才不會Avtivate到自己
Me.Caption = ""
AppActivate title //activate先前就已行的程式
End
End If
End Sub

2007-03-01 22:54:03 補充:
Public Sub CheckExist(fm As Form)
On Error GoTo Err
Dim title As String
If App.PrevInstance Then
title = App.title

App.title = "" //如此才不會Avtivate到自己

2007-03-01 22:54:07 補充:
Me.Caption = ""
AppActivate title //activate先前就已行的程式

End
End If

Exit Sub

Err:

Unload Me
End Sub

2007-03-01 17:12:55 · answer #5 · answered by 醉愛翡翠珠寶精品 3 · 0 0

fedest.com, questions and answers