Отслеживание изменений буфера обмена (C)

Приветствую. Есть код на C, который выводит в консоль содержимое буфера обмена (текст или путь к файлам):

#include <stdio.h>
#include <stdlib.h>
#include "Windows.h"
#include <locale.h>

/*BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
        static HWND hNextViewer;
        hNextViewer = SetClipboardViewer(hDlg);
        switch(msg)
        {
             case WM_DRAWCLIPBOARD:
             {
                if(IsWindow(hNextViewer))
                {
                        PostMessage(hNextViewer, msg, wParam, lParam);
                }
             }
             case WM_CHANGECBCHAIN:
             {
                if(hNextViewer == (HWND)wParam) hNextViewer = (HWND)lParam;
                else if(IsWindow(hNextViewer)) PostMessage(hNextViewer, msg, wParam, lParam);
             }
        }
        ChangeClipboardChain(hDlg, hNextViewer);
}*/

char* GetClipBoard(void)
{
    HWND hwnd = GetDesktopWindow();
    char* fromClipboard;//в эту переменную сохраним текст из буфера обмена
    if (OpenClipboard(hwnd))//открываем буфер обмена
    {
        if(IsClipboardFormatAvailable(CF_TEXT))
                {
            HANDLE hData = GetClipboardData(CF_TEXT);//извлекаем текст из буфера обмена
                        fromClipboard = (char*)GlobalLock(hData);//блокируем память и получаем содержимое
            GlobalUnlock(hData);//разблокируем память
            CloseClipboard();//закрываем буфер обмена
                        //вывод на консоль
            //AddClipboardFormatListener(hwnd);
        }
        else
        {
            HANDLE hData = GetClipboardData(CF_HDROP);
                    if(hData>0)
            {
                                int i, nBufSize=2;
                                for(i=0;nBufSize>1;i++)
                {
                                    nBufSize = DragQueryFile(hData, i, NULL, 0)+1;
                                    if(nBufSize>1)
                    {
                                                char *fName = (char*)malloc(nBufSize*sizeof(char));
                                                DragQueryFile(hData, i, fName, nBufSize );
                                                if(fName!=NULL)
                        {
                                                    fromClipboard = (char*)malloc(strlen(fName)+1);
                                                    CharToOem(fName, fromClipboard);
                                                    //вывод на консоль - printf("%s\n",buf);
                                                    free(fromClipboard);
                                                }
                                    }
                                }
                    }
                    CloseClipboard();//закрываем буфер обмена
        }
        //SetClipboardViewer(hwnd);
    }
        return fromClipboard;
}

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Rus");

    GetClipBoard();

    getch();
    return 0;
}

Изменив его, прикреплял к проекту Borland C++. Выводил содержимое буфер обмена на элемент Memo, всё нормально работает.

Вопрос в следующем, как сделать отслеживание изменений буфера обмена? Знаю, что нужно использовать функции ChangeClipboardChain, SetClipboardViewer и т.д. Но ума не приложу, где и как их использовать? Может кто-то подробно объяснить? В интернете искал, но ничего так путного и не нашел на языке C. Буду очень благодарен.

P.S. Либо, можно ссылку на источники какие-нибудь? С доходчивым объяснением (что и куда вставлять) и желательно с примерами. Буду очень признателен!

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.