ページ 11

クリップボードがおかしい

Posted: 2013年2月28日(木) 09:49
by みけCAT
プログラミングの問題というより、パソコンの問題のようです。
Windows Vista SP2 32ビット
Dev-C++5.4.0 gcc4.7.0

クリップボードにコピーされたテキストを取得して処理をするプログラムを作ろうとしています。

コード:

int primeJudge(HWND hWnd,char* prime) {
	HGLOBAL hMem;
	WCHAR* str;
	int error=0;
	if(IsClipboardFormatAvailable(CF_UNICODETEXT)) {
		if(OpenClipboard(hWnd)) {
			if(hMem=(HGLOBAL)GetClipboardData(CF_UNICODETEXT)) {
				WCHAR* strtemp;
				if(strtemp=(WCHAR*)GlobalLock(hMem)) {
					int length=lstrlenW(strtemp)+1;
					str=HeapAlloc(GetProcessHeap(),0,(length+1)*sizeof(WCHAR));
					if(str)lstrcpyW(str,strtemp); else error=1;
					GlobalUnlock(hMem);
				} else error=1;
			} else error=1;
			CloseClipboard();
		} else error=1;
	} else error=1;
	if(error)return 0;

	lstrcpy(prime,"65537");

	HeapFree(GetProcessHeap(),0,str);
	return 1;
}
このコードを書いたのですが、クリップボードのテキストデータが取得できなくて困っています。
GetClipboardDataが失敗しているようなので、GetLastErrorで調べてみたところ、
「この操作を正しく終了しました。」と出て、原因がわかりません。

また、以前作成したこちらのプログラムで試したところ、
CF_TEXTとCF_UNICODETEXTの取得に失敗し、CF_OEMTEXTは取得できるようです。

コード:

#include <stdio.h>
#include <windows.h>

int main(void) {
	UINT format;
	CHAR formatName[1000];
	char filename[1000];
	FILE* fp;
	HGLOBAL hMem;
	void* pMem;
	if(!OpenClipboard(0)) {
		puts("OpenClipboard Failed.");
		return 1;
	}
	puts("EnumClipboardFormats");
	format=0;
	while(format=EnumClipboardFormats(format)) {
		printf("0x%08X",(unsigned int)format);
		if(GetClipboardFormatName(format,formatName,sizeof(formatName))) {
			printf(" %s",formatName);
		} else {
			formatName[0]=0;
		}
		puts("");
		hMem=GetClipboardData(format);
		if(hMem==NULL) {
			puts("GetClipboardData Failed.");
		} else {
			pMem=GlobalLock(hMem);
			if(pMem==NULL) {
				puts("GlobalLock Failed.");
			} else {
				sprintf(filename,"dump\\0x%08X_%s",
					(unsigned int)format,formatName);
				fp=fopen(filename,"wb");
				if(fp==NULL) {
					puts("fopen Failed.");
				} else {
					fwrite(pMem,1,GlobalSize(hMem),fp);
					fclose(fp);
				}
				GlobalUnlock(hMem);
			}
		}
	}
	CloseClipboard();
	return 0;
}
他人のプログラムで試したところ、INASOFTの『コピペテキスト修飾除去』は正常に動作するのですが、
『マウスのお供』のクリップボード機能は動作しませんでした。

また、他のテキスト(サクラエディタ/FIrefox/MS Word)からDev-C++に貼り付けできない現象が発生しています。

何か解決する方法は考えられるでしょうか?
よろしくお願いします。

Re: クリップボードがおかしい

Posted: 2013年2月28日(木) 10:08
by softya(ソフト屋)
何らかのフリーソフトとか、ウィルス対策ソフトとか外的要因が邪魔してませんか?

Re: クリップボードがおかしい

Posted: 2013年2月28日(木) 10:38
by みけCAT
確かにウイルス対策ソフトのWebroot SecureAnywhereを切ってみたところ、
提示した2件のプログラムおよびDev-C++の動作が改善しました。

これからどうしましょうか…

Re: クリップボードがおかしい

Posted: 2013年2月28日(木) 10:54
by softya(ソフト屋)
パスワード盗用やキーロガー対策みたいなので、ソフト個別に設定するかWebroot SecureAnywhereの設定でクリップボード監視を完全に無効にするかでしょうね。

Re: クリップボードがおかしい

Posted: 2013年2月28日(木) 10:59
by みけCAT
とりあえずサポートに連絡してみました。

Re: クリップボードがおかしい

Posted: 2013年2月28日(木) 11:06
by みけCAT
IDとプライバシー > 保護されたアプリケーションの表示と編集
で、問題を起こしているプログラムを拒否から保護に変えたところ、
自作プログラム、Dev-C++、マウスのお供が全て正常動作になりました。