打開第二次VB程序時通知第一次運行的程序並自己關閉的方法

 開場白:很多程序,如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的地方,希望哪位有更好的方法來解決這個問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章