Win32编程实现剪贴板监控查看
网络上有很多使用MFC和.NET实现windows剪贴板监控的程序。这里参考《Windows程序设计(第五版)》实现了一个最简单的Win32剪贴板监控程序。采用原始的win32编程,不适用MFC和.NET等的封装库。
下面是需要修改的WndProc函数。(整个工程在https://github.com/kingzone/ClipboardMonitor)
//// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)//// 目的: 处理主窗口的消息。//// WM_COMMAND- 处理应用程序菜单// WM_PAINT- 绘制主窗口// WM_DESTROY- 发送退出消息并返回////LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;static HWND hwndNextViewer; HGLOBAL hGlobal;PTSTR pGlobal;RECT rect;switch (message){case WM_CREATE:hwndNextViewer = SetClipboardViewer(hWnd);break;case WM_CHANGECBCHAIN:if((HWND)wParam == hwndNextViewer)hwndNextViewer = (HWND)lParam;else if(hwndNextViewer)SendMessage(hwndNextViewer, message, wParam, lParam);//return 0;break;case WM_DRAWCLIPBOARD:if(hwndNextViewer)SendMessage(hwndNextViewer, message, wParam, lParam);InvalidateRect(hWnd, NULL, TRUE);//return 0;break;case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);// 分析菜单选择:switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意绘图代码...// OpenClipboard, GetClipboardData, CloseClipboardGetClientRect(hWnd, &rect);OpenClipboard(hWnd);#ifdef UNICODEhGlobal = GetClipboardData(CF_UNICODETEXT);#else hGlobal = GetClipboardData(CF_TEXT);#endifif(hGlobal != NULL){pGlobal = (PTSTR)GlobalLock(hGlobal);DrawText(hdc, pGlobal, -1, &rect, DT_EXPANDTABS);GlobalUnlock(hGlobal);}CloseClipboard();EndPaint(hWnd, &ps);break;case WM_DESTROY:ChangeClipboardChain(hWnd, hwndNextViewer);PostQuitMessage(0);//return 0;break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}