//CHAR char
//PSTR или LPSTR = char*
//PCSTR или LPCSTR = const char*
//PWSTR или LPWSTR = wchar_t*
//PCWSTR или LPCWSTR = const wchar_t*
#define UNICODE
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <winuser.h>
#define IDM_EXIT 0x10
HINSTANCE hinst; //Дескриптор основного окна
INT uFormat = (UINT)(-1); //
void WINAPI SetAutoView(HWND hwnd); //
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); //
//-------------------------------------- ---------------------------------------- ---------------
HWND hKnob; //Дескриптор кнопки
HWND hTextBOX; //Дескриптор основного текстового окна
HWND hCheckcBox; //Дескриптор чекбокса
HWND hLogWindow1; //Дескриптор окна лога 1
wchar_t PrintMass[200000]; //Массив текстового окна. wchar_t для UNICODE, char для ANSI
void ClearMultitext(void); //
void PrintMultitext(wchar_t* COMString); //
//-------------------------------------- ---------------------------------------- ---------------
// точка входа
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{ //
hinst = hInstance; //
WNDCLASS wc; //
wc.lpszClassName = (L"ClipBordPaster"); //
wc.hInstance = hInstance; //
wc.lpfnWndProc = MainWndProc; // !!! оконная функция
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //
wc.hIcon = 0; //
wc.lpszMenuName = 0; //
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 0); //
wc.style = CS_HREDRAW | CS_VREDRAW; //
wc.cbClsExtra = 0; //
wc.cbWndExtra = 0; //
if (!RegisterClass(&wc)) //
return 0; //
//Добавление меню "Auto", "Exit", "Format"
HMENU hMenu = CreateMenu(); //Создание пустого меню
//Создание основного окна
//-------------------------------------- ---------------------------------------- ---------------
HWND hWnd = CreateWindowW(wc.lpszClassName, (L"ClipBordPaster"), WS_OVERLAPPEDWINDOW|WS_BORDER|WS_CAPTION , CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, hMenu, hInstance, 0);
//-------------------------------------- ---------------------------------------- ---------------
hTextBOX = CreateWindowW((L"EDIT"), NULL, WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT |ES_MULTILINE | ES_AUTOVSCROLL, 10, 150, 600, 200, hWnd, (HMENU)0, 0, NULL);
//SendMessage (hTextBOX, ES_READONLY, 1, 0); //
//LoadLibrary((L"Msftedit.dll" ));
//hTextBOX = CreateWindowEx(0, MSFTEDIT_CLASS, (L"Type here"),
// ES_MULTILINE | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP,
// x, y, width, height,
// hwndOwner, NULL, hinst, NULL);
HFONT hFont = CreateFont(18, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, OEM_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, (L"Tahoma"));
SendMessage(hTextBOX, WM_SETFONT, WPARAM(hFont), 0);
//-------------------------------------- ---------------------------------------- ---------------
//Чекбокс
hCheckcBox = CreateWindowW((L"button"), (L"Look Buffer"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 350, 30, 220, 30, hWnd, (HMENU)10004, hInstance, NULL);
SendMessage(hCheckcBox, BM_SETCHECK, BST_CHECKED, 0); //
//-------------------------------------- --------------------------- ----------------------------
hLogWindow1 = CreateWindowW((L"edit"), (L""), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 10, 30, 160, 20, hWnd, 0, hInstance, NULL);
//-------------------------------------- ---------------------------------------- ----------------
//Кнопка. Команда Fill Device Chip
hKnob = CreateWindowW((L"button"), (L"Save To File"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 330, 100, 280, 30, hWnd, (HMENU)10008, hInstance, NULL);
//-------------------------------------- ---------------------------------------- ----------------
//Очистка буфера обмена
OpenClipboard(hWnd); //
EmptyClipboard(); //
CloseClipboard(); //
ClearMultitext(); //Две строки ниже должны быть после очистки буфера обмена
ShowWindow(hWnd, nCmdShow); //Покаать основное окно
UpdateWindow(hWnd); //Обновляет клиентскую область указанного окна, посылая ему сообщение WM_PAINT
//Цикл обработки сообщений
MSG msg; //
while (GetMessage(&msg, 0, 0, 0)) //
{ //
if (GetAsyncKeyState(VK_ESCAPE)) { CloseClipboard(); PostQuitMessage(0);} //Выход по ESC
TranslateMessage(&msg); //Переводит сообщения виртуальных клавиш в символьные сообщения
DispatchMessage(&msg); //Распределяет сообщение оконной процедуре. Обычно она используется, чтобы доставить сообщение, извлеченное функцией GetMessage
} //
return msg.wParam; //
} //
//-------------------------------------- ---------------------------------------- ---------------
LRESULT APIENTRY MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //
{ //
RECT rc; //Координаты рабочей области окна.
HDC hdc; //
HDC hdcMem; //
wchar_t* lpstr; //
LPRECT lprc; //
LRESULT res; //
HGLOBAL hglb; //
PAINTSTRUCT ps; //
HWND hwndOwner; //
LPPAINTSTRUCT lpps; //
static HWND hwndNextViewer; //
switch (uMsg) //
{ //
//-------------------------------------- ---------------------------------------- ---------------
case WM_PAINT: //
//-------------------------------------- ---------------------------------------- ---------------
hdc = BeginPaint(hwnd, &ps); //Готовит заданное окно к окрашиванию и заполняет структуру PAINTSTRUCT информацией об окрашивании.
switch (uFormat) //Переключатель форматов
{ //
//-------------------------------------- ---------------------------------------- ---------------
case CF_TEXT: //
case CF_UNICODETEXT: //
//-------------------------------------- ---------------------------------------- ---------------
res = SendMessage (hCheckcBox, BM_GETCHECK, 0, 0); //
if(!(res == BST_CHECKED)) {break;} //
if (OpenClipboard(hwnd)) //Открывает буфер обмена для проверки и не дает другим приложениям модифицировать его содержание.
{ //CF_UNICODETEXT - читает буфер в UNICODE. CF_TEXT - читает буфер в ANSI
hglb = GetClipboardData(CF_UNICODETEXT); //Извлекает данные из буфера обмена в заданном формате.
lpstr = (wchar_t*)GlobalLock(hglb); //Возвращает указатель на данный объект памяти глобальных данных
GetClientRect(hwnd, &rc); //Извлекает координаты рабочей области окна.
PrintMultitext(lpstr); //Вывод в основное окно
//DrawText(hdc, lpstr, -1, &rc, DT_LEFT); //Прорисовывает содержимое буфера в квадрате &rc
GlobalUnlock(hglb); //
EmptyClipboard(); //
CloseClipboard(); //
} //
break; //
//-------------------------------------- ---------------------------------------- ---------------
case
//
//-------------------------------------- ---------------------------------------- ---------------
GetClientRect(hwnd, &rc); //Извлекает координаты рабочей области окна.
DrawTextW(hdc, (L"The clipboard is empty."), -1, &rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
break; //
//-------------------------------------- ---------------------------------------- ---------------
default: //
//-------------------------------------- ---------------------------------------- ---------------
GetClientRect(hwnd, &rc); //
DrawTextW(hdc, (L"Unable to display format."), -1, &rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
} //switch (uFormat)
EndPaint(hwnd, &ps); //Отмечает конец окрашивания в заданном окне. Эта функция требуется для каждого вызова в функции BeginPaint
break; //
//-------------------------------------- ---------------------------------------- ---------------
case WM_CREATE: //Сообщение WM_CREATE отправляется тогда, когда программа запрашивает, какое окно будет создаваться вызовом функции или CreateWindow.
//-------------------------------------- ---------------------------------------- ---------------
//Функция SetClipboardViewer добавляет заданное окно к цепочке окон просмотра буфера обмена. Окна просмотра буфера обмена получают сообщение WM_DRAWCLIPBOARD всякий раз, когда содержание буфера изменяется.
//Аргумент - дескриптор окна, которое добавляется к цепочке окон буфера обмена.
hwndNextViewer = SetClipboardViewer(hwnd); //
//AddClipboardFormatListener(hwnd);
break; //
//-------------------------------------- ---------------------------------------- ---------------
case WM_DESTROY: //Сообщение WM_DESTROY отправляется тогда, когда окно разрушается.
//-------------------------------------- ---------------------------------------- ---------------
ChangeClipboardChain(hwnd, hwndNextViewer); //Функция ChangeClipboardChain удаляет заданное окно из цепочки окон просмотра буфера обмена.
//RemoveClipboardFormatListener(hwnd);
PostQuitMessage(0); //Указывает системе, что поток сделал запрос на то, чтобы завершить свою работу (выйти). Используется в ответ на сообщение WM_DESTROY.
break; //
//-------------------------------------- ---------------------------------------- ---------------
//Сообщение WM_DRAWCLIPBOARD отправляется первому окну в цепочке окон просмотра буфера обмена, когда содержание буфера изменяется.
//Это дает возможность окну просмотра буфера обмена показать на экране новое содержание буфера.
case WM_DRAWCLIPBOARD: //clipboard contents changed.
//-------------------------------------- ---------------------------------------- ---------------
SetAutoView(hwnd); //Update the window by using Auto clipboard format.
SendMessage(hwndNextViewer, uMsg, wParam, lParam); //Pass the message to the next window in clipboard viewer chain.
break; //
//-------------------------------------- ---------------------------------------- ---------------
case WM_CHANGECBCHAIN:
// If the next window is closing, repair the chain.
if ((HWND) wParam == hwndNextViewer)
hwndNextViewer = (HWND) lParam;
// Otherwise, pass the message to the next link.
else if (hwndNextViewer != NULL)
SendMessage(hwndNextViewer, uMsg, wParam, lParam);
break;
//-------------------------------------- ---------------------------------------- ---------------
//case WM_CLIPBOARDUPDATE:
// Clipboard content has changed
//break;
//-------------------------------------- ---------------------------------------- ---------------
case WM_INITMENUPOPUP: //
//-------------------------------------- ---------------------------------------- ---------------
CloseClipboard(); //
break; //
//-------------------------------------- ---------------------------------------- ---------------
case WM_COMMAND: //
//-------------------------------------- ---------------------------------------- ---------------
//ЧекБокс
if(LOWORD(wParam) == 10004) //Чекбокс
{ //
res = SendMessage (hCheckcBox, BM_GETCHECK, 0, 0); //Выясняем текущее состояние chechbox'а.
if(res == BST_CHECKED) //Если галочка стоит. hCheckcBox
{ //
OpenClipboard(0); //
EmptyClipboard(); //
CloseClipboard(); //
ClearMultitext(); //
} //
} //
//-------------------------------------- ---------------------------------------- ---------------
//Кнопка. Команда Записать в файл
if(LOWORD(wParam) == 10008) //
{ //
unsigned long RetBytes = 0; //Число записаных байт
wchar_t wsprintfBUF[30] = L""; //Для вывода числа записаных байт
DeleteFileW((L"LogTX.txt")); //Удалить старый файл
HANDLE hFileLocal = CreateFileW((L"LogTX.txt"), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
GetWindowTextW(hTextBOX, PrintMass, 200000); //Читаем в буфер весь текст из текстового окна. GetWindowTextW для UNICODE, GetWindowText для ANSI
WriteFile(hFileLocal, &PrintMass, wcslen(PrintMass)*sizeof(wchar_t), &RetBytes, NULL);//Записать массив. cslen для UNICODE, strlen для ANSI
CloseHandle(hFileLocal); //
wsprintfW(wsprintfBUF, (L"Write: %d byte"), RetBytes); //
SetWindowTextW(hLogWindow1, wsprintfBUF); //Вывести число записаных байт
} //
break; //
//-------------------------------------- ---------------------------------------- ---------------
switch (LOWORD(wParam)) //
{ //
case IDM_EXIT: //
DestroyWindow(hwnd); //
break; //
default: //
uFormat = LOWORD(wParam); //
//InvalidateRect Lобавляет прямоугольник к обновляемому региону заданного окна. Обновляемый регион представляет часть рабочей области окна, которая должна быть перерисована.
InvalidateRect(hwnd, NULL, TRUE); //
} //
break; //
//-------------------------------------- ---------------------------------------- ---------------
default: //switch (uMsg)
//-------------------------------------- ---------------------------------------- ---------------
return DefWindowProc(hwnd, uMsg, wParam, lParam); //
} //switch (uMsg)
return (LRESULT)NULL; //
} //
//-------------------------------------- ---------------------------------------- ---------------
void WINAPI SetAutoView(HWND hwnd) //
{ //
static UINT auPriorityList[] = {CF_UNICODETEXT}; //Числа без знака, идентифицирующих форматы буфера обмена в приоритетном порядке.
uFormat = GetPriorityClipboardFormat(auPriorityLis t, 1); //GetPriorityClipboardFormat извлекает первый доступный формат буфера обмена в заданном списке.
//InvalidateRect Lобавляет прямоугольник к обновляемому региону заданного окна. Обновляемый регион представляет часть рабочей области окна, которая должна быть перерисована.
InvalidateRect(hwnd, NULL, TRUE); //
UpdateWindow(hwnd); //Обновляет клиентскую область указанного окна, посылая ему сообщение WM_PAINT
} //