クリップボードへの転送
Posted feedbacks - D
生憎、今のところそのような便利ライブラリはなさそうなので生のWin32APIを使わざるを得ません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | module win32.clipboard;
private import std.c.windows.windows;
private import std.contracts, std.conv;
export extern(Windows) {
HGLOBAL GlobalAlloc(UINT uFlags, DWORD dwBytes);
HGLOBAL GlobalFree(HGLOBAL hMem);
LPVOID GlobalLock(HGLOBAL hMem);
BOOL GlobalUnlock(HGLOBAL hMem);
enum UINT GMEM_MOVEABLE = 2;
BOOL CloseClipboard();
BOOL EmptyClipboard();
UINT EnumClipboardFormats(UINT format);
HANDLE GetClipboardData(UINT uFormat);
BOOL OpenClipboard(HWND hWndNewOwner);
HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);
enum UINT CF_UNICODETEXT = 13;
}
public static class Clipboard {
static void setText(string text) {
enforce(OpenClipboard(null));
scope(exit) CloseClipboard();
auto wtext = to!(wstring)(text);
auto data = enforce(GlobalAlloc(GMEM_MOVEABLE, wchar.sizeof * (wtext.length + 1)));
scope(failure) GlobalFree(data);
{
auto pdata = cast(wchar*)GlobalLock(data);
scope(exit) GlobalUnlock(data);
pdata[0..wtext.length] = wtext;
pdata[wtext.length] = '\0';
}
enforce(EmptyClipboard());
enforce(SetClipboardData(CF_UNICODETEXT, data));
}
static string getText() {
enforce(OpenClipboard(null));
scope(exit) CloseClipboard();
auto data = GetClipboardData(CF_UNICODETEXT);
if(!data) return null;
auto pdata = cast(const(wchar)*)GlobalLock(data);
auto wtext = pdata[0..strlen(pdata)];
GlobalUnlock(data);
return to!(string)(wtext);
}
}
private uint strlen(const(wchar)* s) {
uint len;
while(*s++) len++;
return len;
}
debug(Clipboard) {
import std.stdio;
void main() {
Clipboard.setText("test テスト");
writeln(Clipboard.getText);
}
}
|




mattsan
#6644()
Rating6/8=0.75
クリップボード(や同等の機能)へテキストを転送するプログラムをお願いします。 また可能でしたらクリップボードのデータを取り出すプログラムもお願いします。
システムに依存する内容ですが、応用範囲が広いと思いましたので出題させてもらいました。
[ reply ]