我正在用全局鉤子寫入dll。其中一項任務是在有人執行復制操作時查看剪貼板並從中刪除所有數據。這裏是我對窗口的回調函數:監控剪貼板
string test("my data");
LRESULT CALLBACK WndHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_CREATE:
nextClipboardViewer = SetClipboardViewer(windowHandler);
MessageBeep(MB_ICONINFORMATION);
break;
case WM_CHANGECBCHAIN:
if((HWND) wParam == nextClipboardViewer)
nextClipboardViewer == (HWND) lParam;
else if(nextClipboardViewer != NULL)
SendMessage(nextClipboardViewer, msg, wParam, lParam);
break;
case WM_DRAWCLIPBOARD:
if(OpenClipboard(windowHandler)) {
EmptyClipboard();
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_MOVEABLE, test.size() + 1);
char * pchData;
pchData = (char*)GlobalLock(hClipboardData);
memcpy(pchData, test.c_str(), test.size() + 1);
GlobalUnlock(hClipboardData);
SetClipboardData(CF_TEXT, hClipboardData);
CloseClipboard();
}
SendMessage(nextClipboardViewer, msg, wParam, lParam);
break;
case WM_DESTROY:
ChangeClipboardChain(windowHandler, nextClipboardViewer);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
break;
}
return 0;
}
我只是想替換剪貼板中的信息,但是這段代碼不起作用。
更新:現在我正在使用不可見窗口和SetClipboardViewer監視更改。但剪貼板中的數據不會改變。
即使這可以作出的工作,你會是陷阱「WM_COPY」消息用於在剪貼板上放置數據的實例 - 無法保證。創建一個窗口並使用'SetClipboardViewer'或'AddClipboardFormatListener'是一個更好的解決方案。 –
在應用程序複製數據之前,清空剪貼板是毫無意義的。錯誤的鉤子,使用WH_CALLWNDPROCRET。你真的*想要使用SetClipboardViewer。如果你沒有HWND,那麼只需創建一個HWND,它不一定是可見的。確保你的卸載程序是完美無瑕的,它會得到很好的鍛鍊。 –