개발/Windows

[Windows] ClipBoard 시리즈 #1 TEXT 확인

-=HaeJuK=- 2024. 5. 27. 14:49

윈도우 환경에서 사용자가 Clipboard에 넣은 TEXT의 내용과 길이를 확인하기 



#include "framework.h"
#include "GetClipboardLength.h"
#include <string>
#include <iostream>
#include <format>

#define MAX_LOADSTRING 100

// 전역 변수:
HINSTANCE hInst;                                // 현재 인스턴스입니다.
WCHAR szTitle[MAX_LOADSTRING];                  // 제목 표시줄 텍스트입니다.
WCHAR szWindowClass[MAX_LOADSTRING];            // 기본 창 클래스 이름입니다.

// 이 코드 모듈에 포함된 함수의 선언을 전달합니다:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);


// 글로벌 변수
HWND hWndNextViewer;

// 윈도우 프로시저
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
    case WM_CREATE:
        // 클립보드 뷰어 체인에 등록
        hWndNextViewer = SetClipboardViewer( hWnd );
        break;

    case WM_DRAWCLIPBOARD:
        // 클립보드 내용이 변경되면 처리
        if( IsClipboardFormatAvailable( CF_TEXT ) )
        {
            if( OpenClipboard( hWnd ) )
            {
                HANDLE hClipboardData = GetClipboardData( CF_TEXT );
                if( hClipboardData != NULL )
                {
                    char* pchData = (char*)GlobalLock( hClipboardData );
                    if( pchData != NULL )
                    {
                        std::string clipboardText( pchData );
                        GlobalUnlock( hClipboardData );

                        // 텍스트 길이 출력
                        std::cout << "Copied text length: " << clipboardText.length() << std::endl;
                        std::string ssTemp1 = std::format( "Copied text :{} ", clipboardText );
                        std::string ssTemp2 = std::format( "Copied text length:{} ", clipboardText.length() );
                        OutputDebugStringA( ssTemp1.c_str() );
                        OutputDebugStringA( ssTemp2.c_str() );
                    }
                }
                CloseClipboard();
            }
        }
        // 다음 뷰어로 메시지 전달
        SendMessage( hWndNextViewer, message, wParam, lParam );
        break;

    case WM_CHANGECBCHAIN:
        // 클립보드 뷰어 체인 변경 처리
        if( (HWND)wParam == hWndNextViewer )
            hWndNextViewer = (HWND)lParam;
        else if( hWndNextViewer != NULL )
            SendMessage( hWndNextViewer, message, wParam, lParam );
        break;

    case WM_DESTROY:
        // 클립보드 뷰어 체인에서 제거
        ChangeClipboardChain( hWnd, hWndNextViewer );
        PostQuitMessage( 0 );
        break;

    default:
        return DefWindowProc( hWnd, message, wParam, lParam );
    }
    return 0;
}



int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 여기에 코드를 입력합니다.

    // 전역 문자열을 초기화합니다.
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_GETCLIPBOARDLENGTH, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 애플리케이션 초기화를 수행합니다:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GETCLIPBOARDLENGTH));


    MSG msg;

    // 기본 메시지 루프입니다:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  함수: MyRegisterClass()
//
//  용도: 창 클래스를 등록합니다.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GETCLIPBOARDLENGTH));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_GETCLIPBOARDLENGTH);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   함수: InitInstance(HINSTANCE, int)
//
//   용도: 인스턴스 핸들을 저장하고 주 창을 만듭니다.
//
//   주석:
//
//        이 함수를 통해 인스턴스 핸들을 전역 변수에 저장하고
//        주 프로그램 창을 만든 다음 표시합니다.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 인스턴스 핸들을 전역 변수에 저장합니다.

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}


// 정보 대화 상자의 메시지 처리기입니다.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
반응형