配合鼠标,剪贴板,学习windows程序设计,主要掌握windows中的消息处理机制。
Demo解释:鼠标获取屏幕上任意一点颜色,然后,将颜色值传入剪贴板,然后去带有粘贴功能的文本编辑器,ctrl+v就能将取得的颜色值复制下来。程序没有任何实战意义,仅是为了实践。
#include <windows.h> void FindWindowSize(int *, int *); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) { TCHAR szAppName[] = TEXT("ColorPicker"); MSG msg; WNDCLASS wndclass; HWND hwnd; int cxWindow, cyWindow; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = szAppName; wndclass.lpszMenuName = NULL; wndclass.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("Run Error"), szAppName, MB_ICONERROR); return 0; } FindWindowSize(&cxWindow, &cyWindow); hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER, CW_USEDEFAULT, CW_USEDEFAULT, cxWindow, cyWindow, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } void FindWindowSize(int *pcxWindow, int *pcyWindow) { HDC hdcScreen; TEXTMETRIC tm; hdcScreen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); GetTextMetrics(hdcScreen, &tm); DeleteDC(hdcScreen); *pcxWindow = 2 * GetSystemMetrics(SM_CXBORDER) + 12 * tm.tmAveCharWidth; *pcyWindow = 2 * GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYCAPTION) + 2 * tm.tmHeight; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static COLORREF cr, crLast; static HDC hdcScreen; HDC hdc; PAINTSTRUCT ps; POINT pt; RECT rc; TCHAR szBuffer[20]; GLOBALHANDLE hGlobal; char *pGlobal; int i = 0; switch (message) { case WM_CREATE: hdcScreen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); SetTimer(hwnd, 1, 100, NULL); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rc); wsprintf(szBuffer, TEXT("#%02X%02X%02X"), GetRValue(cr), GetGValue(cr), GetBValue(cr)); DrawText(hdc, szBuffer, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); // 将值传送至剪贴板 hGlobal = GlobalAlloc(GHND | GMEM_SHARE, 20); if (NULL == hGlobal) { return 0; } pGlobal = (char*)GlobalLock(hGlobal); for (i = 0; i < 20; ++i) { *pGlobal++ = szBuffer[i]; } GlobalUnlock(hGlobal); OpenClipboard(hwnd); EmptyClipboard(); SetClipboardData(CF_TEXT, hGlobal); CloseClipboard(); return 0; case WM_TIMER: GetCursorPos(&pt); cr = GetPixel(hdcScreen, pt.x, pt.y); if (cr != crLast) { crLast = cr; InvalidateRect(hwnd, NULL, FALSE); } return 0; case WM_DESTROY: DeleteDC(hdcScreen); KillTimer(hwnd, 1); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }