буфер обмена

В продолжение поста про ссылки вида clip:text. Внимательный читатель помнит, что я не смог найти программку, которая брала бы строку параметром - все только с stdin работают. Черезж#пное решение меня достало, черное мелькающее окошко консоли раздражает, а иногда имеет гадкое свойство подвисать секунды на две.
Накатал программку все таки:


#include <windows.h>

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hpi, LPSTR cmdline, int ss) {
// выделяем место под строку в куче
HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, strlen(cmdline)+1);
// выделяем место под локаль в куче
HGLOBAL hglbData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,4);
// если на что-то не хватило памяти - выходим
if (hglbCopy == NULL || hglbData == NULL) return 1;

DWORD CodePage=0x419; // локаль cp1251, для русского текста

if (!OpenClipboard(NULL)) return 2; // открываем буфер
if (!EmptyClipboard()) return 3; // чистим буфер

// пихаем значение локали в память
memcpy((char *)GlobalLock(hglbData), (const void *)&CodePage, 4);
GlobalUnlock(hglbData);
// пишем в буфер локаль (иначе запишет в локали текущего потока)
if (!SetClipboardData(CF_LOCALE, hglbData)) return 4;

// пихаем строку в память
strcpy((char *)GlobalLock(hglbCopy), cmdline);
GlobalUnlock(hglbCopy);

// пишем входную строку в буфер
if (!SetClipboardData(CF_TEXT, hglbCopy)) return 5;

CloseClipboard(); // закрываем буфер

return 0;
}
Это моя первая программа на си лет за пять, и первая в жизни, где работа с буфером обмена API функциями. Если есть критика - буду рад выслушать :)

Сим постом торжественно открываю всякие технические записки здесь, для которых были мысли выделить отдельный блог, но потом решил, что нафик-нафик :)

2 comentario:

Непсих dijo...

А куда ты константы возвращаешь?

yumaa dijo...

мм.. не понял? ты о чем?

 

Design in CSS by TemplateWorld and sponsored by SmashingMagazine
Blogger Template created by Deluxe Templates