開場白:很多程序,如WINDOWS MEDIA PLAYER,在程序第二次打開,第一次的程序並未關閉時,會自動激活第一次運行的程序,而且會自動把選取的音樂添加到第一次的那個程序的播放列表裏,這是如何作到的呢?
思路:利用APP對象的PrevInstance屬性,該屬性在該實例運行第二次以上時返回TRUE,並且利用註冊表爲中介,記錄第一次運行的程序的窗體的hWnd值,向其發送一條特定的消息,並在該消息被第一個程序捕獲時分析,讀去作爲中介的註冊表裏的信息即可!OK!開工!
首先,新打開一個工程,添加一個窗體和一個模塊。向模塊裏添加如下幾個API及常數:
SendMessage
SetWindowLong
GetWindowLong
CallWindowProc
GWL_WNDPROC
ZIDINGYIXIAOXI = 101010 '這個常數是自己定的,但一定不要與WINDOWS的消息重複
定義全局LONG類型變量:prevWndProc.作用:保存窗體以前的窗口回調函數,以便在退出時恢復,否則……
在FORM的LOAD事件裏寫下如下代碼:
If App.PrevInstance = True Then '如果已經有一個實例在運行
SendMessage CLng(GetSetting(App.EXEName, "Dynamic Data", "hWnd")), ZIDINGYIXIAOXI, 0, ByVal 0& '發送自定義消息
Unload Me '卸載窗體
Exit Sub '跳出程序
End If
prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) '* '記錄以前的窗口回調函數
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc '* '掛上自己的窗口回調函數
SaveSetting App.EXEName, "Dynamic Data", "hWnd", CStr(Me.hwnd) '在註冊表裏寫下本窗體的句柄
在窗體的UnLoad事件裏寫下如下代碼:
SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc '把窗口回調函數換成以前的,否則會死機
然後,在模塊裏寫這樣一個函數(就是回調函數):
Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = ZIDINGYIXIAOXO Then '判斷是否爲第二個實例發來的自定義消息
Form1.Show '顯示窗體
Form1.WindowState = 2 '最大化
End If
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) '讓Windows處理餘下的消息
End Function
好了,基本思路大概就是這樣了,大家還可以完善,比如把第二個程序被運行時的參數寫到註冊表裏並加以處理.但這只是個框架,那些程序大概就是這麼實現的.
這個方法最大的缺點就是以比較不安全的註冊表作爲記錄hWnd的地方,希望哪位有更好的方法來解決這個問題