Witam.
W schowku mam pewien tekst około 80 znaków. Chcę aby ten tekst wylądował w zmiennej np. string. Jak takie cos zrobić?
0
1
Kod trochę dziwny, ale działa http://www.cplusplus.com/forum/general/48837/#msg266980
Edit: ogarnąłem go, dla potomnych:
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void toClipboard(HWND hwnd, const string &s)
{
OpenClipboard(hwnd);
EmptyClipboard();
HGLOBAL hg = GlobalAlloc(GMEM_MOVEABLE, s.size()+1);
if (!hg)
{
CloseClipboard();
return;
}
memcpy(GlobalLock(hg), s.c_str(), s.size()+1);
GlobalUnlock(hg);
SetClipboardData(CF_TEXT, hg);
CloseClipboard();
GlobalFree(hg);
}
int main ()
{
string s;
getline(cin, s);
toClipboard(GetDesktopWindow(), s);
}
1
Kiedyś testując parę funkcji z WinApi napisałem taki kod:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
char * getClipboardText()
{
HANDLE content = NULL;
char * str = NULL;
if(!OpenClipboard(NULL))
return NULL;
content = GetClipboardData(CF_TEXT);
str = malloc(strlen(content) + 1);
if(NULL == str)
{
CloseClipboard();
return NULL;
}
strcpy(str, content);
CloseClipboard();
return str;
}
int main()
{
char * str = NULL;
puts(str = getClipboardText());
if(NULL == str)
puts("getClipboardText() error!");
else
free(str);
return 0;
}
Na Windows powinno zadziałać. Na innych OS niestety nie wiem, jak pracować ze schowkiem. :)
1
std::string GetClipboardText()
{
std::string result;
#ifdef _WIN32
if(OpenClipboard(NULL))
{
HANDLE data = GetClipboardData(CF_TEXT);
if(data)
{
result = reinterpret_cast<char *>(GlobalLock(data));
GlobalUnlock(data);
}
CloseClipboard();
}
#endif
return result;
}