WindowsXP VC++6.0です。
あるボタンが押されると、
あらかじめ定型文の書かれたファイルdata.txtから文字をよみとり、
メモ帳などのテキストエリアにその内容を貼り付ける機能を作成しています。
どうすればよいのか分からなかったので質問しました。
ファイルから文字列を取得することはできているのですが、
それを貼付することができません。
MFCを使っているのなら、CWnd::SetDlgItemText()がラクです。
MFCを使っていないなら、::SetDlgItemText()がいいと思います。
...おっと、「メモ帳などの」ですか?
「あるボタン」のあるアプリケーションとは別のソフトウェアに対して、ということですか?
クリップボードに貼り付けて、対象となる別のソフトに、Ctrl+Vのキーのメッセージを投げる
とかはできないのかな?
#単なる思いつきです。できないかもしれません。識者の方、フォローよろしくお願いします。
思うに汎用性を考えるならクリップボードにコピーするところまで
そのソフトで行うようにして貼り付けたい位置にカーソルを持っていくのと
Ctrl+Vを押すのはユーザーにやらせても良いような気もしますね。
その方が汎用性が高そうです。
Ctrl+Vを投げるにしても
アプリのメインウインドウのウインドウハンドルがわからないと投げられないと
思うのでそのウインドウを特定する為の情報が必要になりますから。
遅くなりましたが返答して頂きありがとうごさいました。
クリップボードを使うため以下の様に書きました。
----------------------------------------------------
FILE *fp;
char teikeibun[256];
HGLOBAL hg;
PTSTR strMem;
if((fp = fopen(userdata.txt,r)) == NULL){
//
}
while(fgets(teikeibun,256,fp) != NULL){
//クリップボードに定型文を保存
if(!OpenClipboard(hWnd)) return 0;
EmptyClipboard();
hg = GlobalAlloc(GHND | GMEM_SHARE,128);
strMem = (PTSTR)GlobalLock(hg);
lstrcpy(strMem,teikeibun);
GlobalUnlock(hg);
SetClipboardData(CF_TEXT,hg);
CloseClipboard();
}
fclose(fp);
----------------------------------------------------
データとなるファイルには
あいうえお
アイウエオ
ABCDE
という内容があるのですが、クリップボードに保存した後に
貼り付けを行うと
ABCDEABCDEABCDE
となって、行の数だけ最後の行が出力されてしまいます。
whileを使わずに一度だけfgetsを行うと
あいうえお
と出力されます。どこかおかしい所がありますか?
> どこかおかしい所がありますか?
1.ループの中で SetClipboardData と EmptyClipboard を繰り返し呼んでいます。
せっかくセットしたデータを、次のループでクリアしてしまっています。
2.teikeibun は 256 バイトなのに、GlobalAlloc では 128 バイトしか
確保していません。
3.GMEM_SHARE は指定しても意味がありません。
4.GlobalFree していません。
しかしなぁ…
> ABCDEABCDEABCDE
こうなる理由はわかんないなぁ。
lstrcpy()をlstrcat()にしてみては?
で、↑のGlobalAlloc()とかはloopの外に出しちゃうとか。
私なら、クリップボードに転送する文字列を予め作成しておき、
クリップボードへの転送は1回で済まします。
クリップボードは、システム共有なので、共有資源をループで
占有していまうことは、なるべく避けた方が良いと思います。