установить GLOBAL текст буфера обмена в Windows, родной C ++ - PullRequest
1 голос
/ 05 июля 2010

У меня есть строка ASCII (массив символов с нулевым символом в конце) в консольном приложении.

Все, что я хочу сделать, это сделать так, чтобы мое приложение поместило эту строку в «глобальный буфер обмена», чтобы послезапустив его, я могу нажать Ctrl + V в любом стандартном приложении (в данном случае в Visual Studio), и моя строка будет вставлена!

как мне это сделать?

Я сделал:

void SetClipboardText(char* txt)
{
    if(!OpenClipboard(NULL))
    {
        __asm int 3;
    }

    int l = PIstrlen(txt);
    HLOCAL la = GlobalAlloc(LMEM_MOVEABLE,l+1);
    void* dest = GlobalLock(la);
    PImemcpy(dest,txt,l+1);
    GlobalUnlock(la);
    if(!SetClipboardData(CF_OEMTEXT,la))
    {
        __asm int 3;
    }
    CloseClipboard();
}

Я пробовал CF_TEXT, CF_OEMTEXT, CF_UNICODE, я пробовал NULL и GetDesktopWindow () при открытии буфера обмена

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

Ответы [ 3 ]

6 голосов
/ 05 июля 2010

Как установить текст в буфере обмена

CString source; 
//put your text in source
if(OpenClipboard())
{
    HGLOBAL clipbuffer;
    char * buffer;
    EmptyClipboard();
    clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
    buffer = (char*)GlobalLock(clipbuffer);
    strcpy(buffer, LPCSTR(source));
    GlobalUnlock(clipbuffer);
    SetClipboardData(CF_TEXT,clipbuffer);
    CloseClipboard();
}

Как получить текст из буфера обмена

char * buffer;
if(OpenClipboard())
{

    buffer = (char*)GetClipboardData(CF_TEXT);
    //do something with buffer here 
    //before it goes out of scope

}

CloseClipboard(); 
3 голосов
/ 05 июля 2010

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

Частично проблема может быть в том, что вы используете LMEM_MOVEABLE с GlobalAlloc, когда вы должны использовать GMEM_MOVEABLE, но я не проверял это.

0 голосов
/ 05 июля 2010

Я должен был сначала очистить буфер обмена, вызвав EmptyClipboard ()

Я думаю, это потому, что из всех пробных CF_XXX я не выбрал для текста самый «стандартный».

идея в том, что вы можете скопировать изображение, затем скопировать текст, и оба они будут помещены в буфер обмена, так что вы можете затем перейти в программу для работы с изображениями, нажать Вставить, и она вставит изображение, затем перейдите ктекстовую программу, нажмите «вставить», и текст будет вставлен.

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

, так что да, мое не совсем идеальное решение было просто добавить EmptyClipboard () послеOpenClipboard (), это приводит к удалению всего из буфера обмена и программам по умолчанию для вставки моего не полностью стандартного текста формата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...