Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

老師,我有問題

2 views
Skip to first unread message

林俊碩 Lin Chun Shuo

unread,
Sep 5, 2005, 9:49:15 AM9/5/05
to
呃,好吧,我知道課程是結束了

但是,這是在課程結束前問的問題

就是啊,當我們寫了一個結合老師所教的東西而成的程式時

就會有人想要讓它在windows的背景中執行,就是讓它縮到右下角就是了

像msn一樣

記得老師說過要查windows的api

但是,我不是神,所以我不知道windows的api在哪orz

所以,可以請老師告訴我要上哪查還是要怎麼做嗎 m(_ _)m


林冠儒 Lin Kuan Ju

unread,
Sep 5, 2005, 11:04:16 AM9/5/05
to
我只有用VB寫過

先宣告一個API出來

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICANDATA) As Long

然後宣告一個資料結構變數

Type NOTIFYICANDATA
cbSize As Long
hWnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type

再宣告常數
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4

圖示加入

Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid) '取資料結構長度給sbSize
nid.hWnd = Me.hWnd '把視窗的hWnd設定給hWnd
nid.uID = 9999 '取一個ID 可自訂
nid.uFlags = NIF_ICON '表示設定成圖示
nid.hIcon = Me.hIcon '設定成表單的Icon

Shell_NotifyIcon NIM_ADD, nid

圖示刪除
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid) '取資料結構長度給sbSize
nid.hWnd = Me.hWnd '把視窗的hWnd設定給hWnd
nid.uID = 9999 '剛剛設定的ID

Shell_NotifyIcon NIM_DELETE, nid

圖示修改
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid) '取資料結構長度給sbSize
nid.hWnd = Me.hWnd '把視窗的hWnd設定給hWnd
nid.uID = 9999 '剛剛設定的ID
nid.uFlags = NIF_ICON '表示設定成圖示
nid.hIcon = Image1.Picture '設定成Image1的圖示

Shell_NotifyIcon NIM_MODIFY, nid

這些範例都只有弄圖示
如果要加提示文字和訊息編號
就要去修改uFlags的內容
例如要動圖示和提示文字
就要用
nid.uFlags = NIF_ICON + NIF_TIP

然後就要加一行程式碼
nid.szTip = "測試文字" & Chr(0)

如果是動到訊息編號
就要用
nid.uCallbackMessage = 1234 '數字可自訂
然後這個就要用Windows的攔截訊息API去取得訊息

這時候需要三個API Function
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long,ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

然後又需要常數
Public Const GWL_WNDPROC = (-4)

現在需要一個全域變數
public PreWndProc As Long

接下來要建一個新檔Module

要寫進一個function

Function WndProc (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

接下來在Form的Load寫兩行程式碼
PreWndProc = GetWindowProc(Me.hWnd,GWL_WNDPROC)
SetWindowProc Me.hWnd, GWL_WNDPROC, AddressOf WndProc

在Form的Unload寫一行程式碼
SetWindowProc Me.hWnd, GWL_WNDPROC, PreWndProc
這一行結束程式前一定要執行到
不然連VB都會跳掉
而且最好執行前先存檔

然後再WndProc裡面寫一段程式碼
If Msg = 剛剛設定的訊息編號 Then
.....要執行的程式碼
End If
WndProc = CallWindowProc(preWndProc, hWnd, Msg, wParam, lParam)

大概就是這樣
蠻多東西的
但是都還蠻簡單的
有點類似C的語法
不過我只有用VB寫過
有人知道VC的寫法就PO一下吧
^^

lagauche

unread,
Sep 19, 2005, 11:12:38 AM9/19/05
to
http://www.codeproject.com/shell/systemtray.asp

--

*** Modified files in JOE when it aborted on Sat Nov 13 23:45:21 2004
*** JOE was aborted because the terminal closed

0 new messages