剪貼簿(clipboard)是記憶體中的一塊區域,是windows內建的乙個非常有用的工具,通過小小的剪貼簿,架起了一座彩橋,使得在各種應用程式之間,傳遞和共享資訊成為可能。然而美中不足的是,剪貼簿只能保留乙份資料,每當新的資料傳入,舊的便會被覆蓋。
最主要的是setclipboardviewer,每當剪貼簿的內容發生變化時,該函式通過wm_drawclipboard訊息將視窗加入被通知的視窗鏈。
由於剪貼簿觀察器鏈中下乙個視窗的控制代碼還沒有返回,應用程式不應傳遞它在setclipboardviewer
呼叫過程中接收到的wm_drawclipboard訊息。
如果要從剪貼簿觀察器鏈中去掉視窗鏈,則應用程式必須呼叫changeclipboard成員函式。
? 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#region definitions
//constants for api calls...
private
const
int
wm_drawclipboard =
0x308
;
private
const
int
wm_changecbchain =
0x30d
;
//handle for next clipboard viewer...
private
intptr mnextclipboardviewerhwnd;
//api declarations...
[dllimport(user32.dll, charset = charset.auto)]
static
public
extern intptr setclipboardviewer(intptr hwndnewviewer);
[dllimport(user32.dll, charset = charset.auto)]
static
public
extern bool changeclipboardchain(intptr hwnd, intptr hwndnext);
[dllimport(user32.dll, charset = charset.auto)]
public
static
extern
int
sendmessage(intptr hwnd,
int
msg,
int
wparam,
int
lparam);
#endregion
作業系統向應用程式傳送一系列訊息,如左鍵按下和左鍵抬起,應用程式將通過getmessage等方法最終將訊息提交到視窗過程(wndproc[英文全稱windows process])指向乙個應用程式定義的視窗過程的指標。
我們需要重寫該函式來處理剪貼簿內容改變事件:
? 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#region message process
//override wndproc to get messages...
protected
override
void
wndproc(ref message m)
//顯示剪貼簿中的資訊
if
(clipboard.containsimage())
break
;
}
case
wm_changecbchain:
else
break
;
}
}
base.wndproc(ref m);
}
#endregion
效果:
c 實現Windows剪貼簿監視器
剪貼簿 clipboard 是記憶體中的一塊區域,是windows內建的乙個非常有用的工具,通過小小的剪貼簿,架起了一座彩橋,使得在各種應用程式之間,傳遞和共享資訊成為可能。然而美中不足的是,剪貼簿只能保留乙份資料,每當新的資料傳入,舊的便會被覆蓋。最主要的是setclipboardviewer,每...
c 實現Windows剪貼簿監視器
剪貼簿 clipboard 是記憶體中的一塊區域,是windows內建的乙個非常有用的工具,通過小小的剪貼簿,架起了一座彩橋,使得在各種應用程式之間,傳遞和共享資訊成為可能。然而美中不足的是,剪貼簿只能保留乙份資料,每當新的資料傳入,舊的便會被覆蓋。最主要的是setclipboardviewer,每...
用 C 監視剪貼簿的活動狀態
翻譯的不好的地方望指出。一步一步的教導 處理 wm drawclipboard 訊息。可以提供乙個 form 類超載 wndproc 類成員函式做到。不久你會看到乙個例子。處理 wm changecbchain 訊息。因為每個視窗處理 wm drawclipboard 訊息時負責傳送這一訊息給在鍊錶...