質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1347閲覧

WinAPI Clipboard のFile Contentが取得できない

Weapon

総合スコア106

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/12/04 03:56

前提・実現したいこと

以前の質問teratail:動的確保文字列の文字列関数(strcpy/wcscat等)の使用から改修して上手くいきましたがファイルを選択してペーストするとFile ContentというクリップデータがGetClipboardData()が失敗してハンドルを取得できません.
まだ抜けている仕様等があるのでしょうか.

該当のソースコード

C

1//main 2#define UNICODE 3 4#include <windows.h> 5#include "ClipBoardElement.h" 6 7#define ID_PASTE 10001 8 9LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 10 11int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow) 12{ 13 UNREFERENCED_PARAMETER(hPrevInstance); 14 UNREFERENCED_PARAMETER(lpszCmdLine); 15 16 wchar_t CLASS_NAME[] = L"sample"; 17 18 WNDCLASSEX wc = { 19 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, WindowProc, 20 0, 0, hInstance, 21 NULL, (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED),(HBRUSH)GetStockObject(WHITE_BRUSH), 22 NULL, CLASS_NAME, NULL 23 }; 24 25 RegisterClassEx(&wc); 26 27 HWND hwnd = CreateWindowEx( 28 0, CLASS_NAME, L"ClipBoard Analyzer", WS_OVERLAPPEDWINDOW, 29 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 30 NULL, NULL, hInstance, NULL); 31 if (hwnd == NULL)return 0; 32 33 static ACCEL accel[1]; 34 accel[0].key = 0x56; 35 accel[0].cmd = ID_PASTE; 36 accel[0].fVirt = FCONTROL | FVIRTKEY; 37 38 HACCEL haccel = CreateAcceleratorTable(accel, 1); 39 40 ShowWindow(hwnd, nCmdShow); 41 UpdateWindow(hwnd); 42 43 MSG msg = {}; 44 while (GetMessage(&msg, NULL, 0, 0) > 0) { 45 if (!TranslateAccelerator(hwnd, haccel, &msg)) { 46 TranslateMessage(&msg); 47 DispatchMessage(&msg); 48 } 49 } 50 51 DestroyAcceleratorTable(haccel); 52 53 return (int)msg.wParam; 54} 55 56LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 57{ 58 static RECT rc; 59 60 switch (uMsg) { 61 case WM_CREATE: 62 static LPWSTR str; 63 64 break; 65 66 case WM_COMMAND: 67 if (LOWORD(wParam) == ID_PASTE) 68 { 69 if (str != NULL)free(str); 70 GetClipboardElement(hwnd, &str); 71 InvalidateRect(hwnd, NULL, TRUE); 72 } 73 74 break; 75 76 case WM_PAINT: 77 { 78 PAINTSTRUCT ps = {}; 79 HDC hdc = GetDC(hwnd); 80 81 BeginPaint(hwnd, &ps); 82 GetClientRect(hwnd, &rc); 83 DrawText(hdc, str, -1, &rc, DT_LEFT); 84 EndPaint(hwnd, &ps); 85 } 86 break; 87 88 case WM_DESTROY: 89 if (str != NULL)free(str); 90 91 PostQuitMessage(0); 92 return 0; 93 94 default: 95 break; 96 } 97 98 return DefWindowProc(hwnd, uMsg, wParam, lParam); 99} 100

C

1//ClipBoardElement.h 2#pragma once 3#include <windows.h> 4 5typedef struct _tagCBCONTENT { 6 wchar_t wFileName[1024]; 7 int iElemName; 8 size_t ElemSize; 9}CBCONTENT; 10 11DWORD GetClipboardElement(HWND hwnd, LPWSTR* lpp); 12

C

1//ClipBoardElement.cpp 2#ifndef UNICODE 3#define UNICODE 4#endif 5 6#include <windows.h> 7#include "ClipBoardElement.h" 8 9size_t SizeElement(UINT); 10 11DWORD GetClipboardElement(HWND hwnd, LPWSTR* lpp) { 12 OpenClipboard(hwnd); 13 14 int countelement = CountClipboardFormats(); 15 16 CBCONTENT* cbform = (CBCONTENT*)malloc(countelement * sizeof(CBCONTENT)); 17 18 UINT format = EnumClipboardFormats(0); 19 20 for (int cb = 0; cb < countelement; cb++) { 21 switch (format) { 22 case CF_TEXT: 23 wcscpy_s(cbform[cb].wFileName, L"CF_TEXT"); 24 break; 25 case CF_BITMAP: 26 wcscpy_s(cbform[cb].wFileName, L"CF_BITMAP"); 27 break; 28 case CF_METAFILEPICT: 29 wcscpy_s(cbform[cb].wFileName, L"CF_METAFILEPICT"); 30 break; 31 case CF_SYLK: 32 wcscpy_s(cbform[cb].wFileName, L"CF_SYLK"); 33 break; 34 case CF_DIF: 35 wcscpy_s(cbform[cb].wFileName, L"CF_DIF"); 36 break; 37 case CF_TIFF: 38 wcscpy_s(cbform[cb].wFileName, L"CF_TIFF"); 39 break; 40 case CF_OEMTEXT: 41 wcscpy_s(cbform[cb].wFileName, L"CF_OEMTEXT"); 42 break; 43 case CF_DIB: 44 wcscpy_s(cbform[cb].wFileName, L"CF_DIB"); 45 break; 46 case CF_PALETTE: 47 wcscpy_s(cbform[cb].wFileName, L"CF_PALETTE"); 48 break; 49 case CF_PENDATA: 50 wcscpy_s(cbform[cb].wFileName, L"CF_PENDATA"); 51 break; 52 case CF_RIFF: 53 wcscpy_s(cbform[cb].wFileName, L"CF_RIFF"); 54 break; 55 case CF_WAVE: 56 wcscpy_s(cbform[cb].wFileName, L"CF_WAVE"); 57 break; 58 case CF_UNICODETEXT: 59 wcscpy_s(cbform[cb].wFileName, L"CF_UNICODETEXT"); 60 break; 61 case CF_ENHMETAFILE: 62 wcscpy_s(cbform[cb].wFileName, L"CF_ENHMETAFILE"); 63 break; 64 case CF_HDROP: 65 wcscpy_s(cbform[cb].wFileName, L"CF_HDROP"); 66 break; 67 case CF_LOCALE: 68 wcscpy_s(cbform[cb].wFileName, L"CF_LOCALE"); 69 break; 70 case CF_MAX: 71 wcscpy_s(cbform[cb].wFileName, L"CF_MAX"); 72 break; 73 case CF_OWNERDISPLAY: 74 wcscpy_s(cbform[cb].wFileName, L"CF_OWNERDISPLAY"); 75 break; 76 case CF_DSPTEXT: 77 wcscpy_s(cbform[cb].wFileName, L"CF_DSPTEXT"); 78 break; 79 case CF_DSPBITMAP: 80 wcscpy_s(cbform[cb].wFileName, L"CF_DSPBITMAP"); 81 break; 82 case CF_DSPMETAFILEPICT: 83 wcscpy_s(cbform[cb].wFileName, L"CF_DSPMETAFILEPICT"); 84 break; 85 case CF_DSPENHMETAFILE: 86 wcscpy_s(cbform[cb].wFileName, L"CF_DSPENHMETAFILE"); 87 break; 88 default: 89 GetClipboardFormatName(format, cbform[cb].wFileName, 1024); 90 } 91 cbform[cb].iElemName = format; 92 cbform[cb].ElemSize = SizeElement(format); 93 94 format = EnumClipboardFormats(format); 95 } 96 97 size_t size = 0; 98 for (int cb = 0; cb < countelement; cb++) { 99 size += cbform[cb].ElemSize; 100 wchar_t messageid[1024]; 101 wsprintf(messageid, L"%d\nint Name : %x\nwide Name : %s\nsize : %d", cb, cbform[cb].iElemName, cbform[cb].wFileName,cbform[cb].ElemSize); 102 MessageBox(hwnd, messageid, L"ALERT", MB_OK); 103 } 104 105 wchar_t parameter_in_breaking[1024]; 106 wsprintf(parameter_in_breaking, L"size : %d\ncountelement : %d", size, countelement); 107 MessageBox(hwnd, parameter_in_breaking, L"ALERT", MB_OK); 108 109 size_t countofchar = (size + countelement * 6 + 1) * sizeof(wchar_t); 110 111 LPWSTR lp = (*lpp = (LPWSTR)calloc(countofchar, sizeof(wchar_t))); 112 if (!lp)return -1; 113 114 wcscat_s(lp, countofchar, L"\0"); 115 116 for (int cb = 0; cb < countelement; cb++) { 117 wcscat_s(lp, countofchar, cbform[cb].wFileName); 118 wcscat_s(lp, countofchar, L"\n"); 119 HGLOBAL hg = GetClipboardData(cbform[cb].iElemName); 120 wcscat_s(lp, countofchar, (LPWSTR)GlobalLock(hg)); 121 GlobalUnlock(hg); 122 wcscat_s(lp, countofchar, L"\n\n"); 123 } 124 125 CloseClipboard(); 126 free(cbform); 127 128 return 0; 129} 130 131size_t SizeElement(UINT format) { 132 HGLOBAL hg = GetClipboardData(format); 133 134 if (hg == NULL) { 135 wchar_t errmess[1024]; 136 wsprintf(errmess, L"bin-format : %x\nint-format : %u", format); 137 MessageBox(NULL, errmess, L"ALERT", MB_OK); 138 139 GetClipboardFormatName(format, errmess, 1024); 140 MessageBox(NULL, errmess, L"ALERT", MB_OK); 141 } 142 143 return GlobalSize(hg); 144}

補足情報

Windows10 Pro
VisualStudio2017 Community

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論から言うと File Contents を GetClipboardData で取得することはできません。この形式を取得するには、OleGetClipboard を使用する必要があります。サンプルを探してみましたが、ドラッグ&ドロップのサンプルばっかりで OleGetClipboard で取得しているサンプルはありませんでした。

shlobj.h をインクルードすると CFSTR_FILECONTENTS と言う定数が含まれるようになります。CFSTR_FILECONTENTS をネットを検索すればドラッグ&ドロップのサンプルは見つかりますので、一通り目を通していただいた後でわからないことを質問していただけると良いかと思います。

投稿2018/12/04 16:47

atata0319

総合スコア881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問