Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Komunikacja pomiędzy procesami Win. Schowek.

Kostek7 04 Maj 2010 22:46 1092 0
  • #1
    Kostek7
    Poziom 27  
    Witam.
    Zadanie do wykonania brzmi następująco: na kombinacje klawiszy control+c kopiujemy do naszego schowka tekst, następnie umożliwiamy jego edycje (?) i taki tekst po kombinacji control+v. Mam problem z formatem tekstu pobranego ze schowka (wychodzą krzaczki), nie wiem jak zrealizować edycje tekstu oraz odświeżanie go w schowku. Proszę o propozycje.

    Code:
    #include "stdafx.h"
    
    #include "msgDisplayer.h"
    #include <cstdio>

    #define MAX_LOADSTRING 100

    HINSTANCE hInst;                        
    TCHAR szTitle[MAX_LOADSTRING];               
    TCHAR szWindowClass[MAX_LOADSTRING];         

    LPTSTR tekst;
    char* tekstS;
    const int tekst_length = 100;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ATOM            MyRegisterClass(HINSTANCE hInstance);
    BOOL            InitInstance(HINSTANCE, int);
    LRESULT CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK   About(HWND, UINT, WPARAM, LPARAM);

    BOOL SetClipboardText(LPCTSTR pszText)
    {
       BOOL ok = FALSE;
       if(OpenClipboard(NULL)) {
          HGLOBAL hMem = GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE,
             (lstrlen(pszText)+1)*sizeof(pszText[0]) );
          LPTSTR ptxt = (LPTSTR)GlobalLock(hMem);
          lstrcpy(ptxt, pszText);
          GlobalUnlock(hMem);
          ok = (BOOL)SetClipboardData(CF_TEXT, hMem);

          CloseClipboard();
       }
       return ok;
    }

    int GetClipboardText(LPTSTR pszBuf, int nLength)
    {
       int i = 0;
       *pszBuf = 0;
       if(OpenClipboard(NULL)) {
          HGLOBAL hMem = GetClipboardData(CF_TEXT);
          if(hMem) {
             LPCTSTR ptxt = (LPCTSTR)GlobalLock(hMem);
             for( ; ++i < nLength && *ptxt; )
                *pszBuf++ = *ptxt++;
             *pszBuf = 0;

             GlobalUnlock(hMem);
          }

          CloseClipboard();
       }
       return i;
    }

    int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
    {
       UNREFERENCED_PARAMETER(hPrevInstance);
       UNREFERENCED_PARAMETER(lpCmdLine);

       tekst = (LPTSTR)malloc(sizeof(WCHAR)*tekst_length);
       tekstS = (char*)malloc(sizeof(char)*tekst_length);
       MSG msg;
       HACCEL hAccelTable;

       LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
       LoadString(hInstance, IDC_MSGDISPLAYER, szWindowClass, MAX_LOADSTRING);
       MyRegisterClass(hInstance);

       if (!InitInstance (hInstance, nCmdShow))
       {
          return FALSE;
       }

       hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MSGDISPLAYER));

       while (GetMessage(&msg, NULL, 0, 0))
       {
          if (!TranslateAccelerator(msg.hwnd, hAccelTable, &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;
       wcex.cbClsExtra      = 0;
       wcex.cbWndExtra      = 0;
       wcex.hInstance      = hInstance;
       wcex.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MSGDISPLAYER));
       wcex.hCursor      = LoadCursor(NULL, IDC_ARROW);
       wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);
       wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_MSGDISPLAYER);
       wcex.lpszClassName   = szWindowClass;
       wcex.hIconSm      = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

       return RegisterClassEx(&wcex);
    }

    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;

       hInst = hInstance;

       hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

       if (!hWnd)
       {
          return FALSE;
       }

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

       return TRUE;
    }

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       int wmId, wmEvent;
       PAINTSTRUCT ps;
       RECT   rect;
       HDC hdc;
       HGLOBAL hGlMem;
       char* lpGlMem;
       
       int low = LOWORD(wParam);
       int high = HIWORD(wParam);
       
       ZeroMemory( &si, sizeof(si) );
       si.cb = sizeof(si);
       ZeroMemory( &pi, sizeof(pi) );

       switch (message)
       {
       case WM_COMMAND:
          wmId    = LOWORD(wParam);
          wmEvent = HIWORD(wParam);

          switch (wmId)
          {
          case IDM_EXIT:
             DestroyWindow(hWnd);
             break;
          default:
             return DefWindowProc(hWnd, message, wParam, lParam);
          }
          break;
       case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
          GetClientRect( hWnd, &rect);
          DrawText( hdc, tekst,
             -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
          EndPaint( hWnd, &ps);
          EndPaint(hWnd, &ps);
          break;
       case WM_DESTROY:
          PostQuitMessage(0);
          break;
       case WM_KEYDOWN:

          GetClipboardText(tekst,tekst_length);
          MessageBoxW(0,tekst,0,0);
          SetClipboardText(tekst);

          CreateProcess(L"C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
          break;


       default:
          if(message != WM_PAINT && message != 20) {
             sprintf_s(tekstS, tekst_length, "HWND=%d UINT=%d LOWORD=%d HIWORD=%d LPARAM=%d", hWnd, message, low, high, lParam);
             mbstowcs((wchar_t*)tekst, tekstS, tekst_length);
             InvalidateRect(hWnd, NULL, TRUE);
          }

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