定型文を送る機能について – プログラミング – Home

定型文を送る機能について
 
通知
すべてクリア

定型文を送る機能について


AMY
 AMY
(@AMY)
ゲスト
結合: 19年前
投稿: 2
Topic starter  

WindowsXP VC++6.0です。
あるボタンが押されると、
あらかじめ定型文の書かれたファイルdata.txtから文字をよみとり、
メモ帳などのテキストエリアにその内容を貼り付ける機能を作成しています。
どうすればよいのか分からなかったので質問しました。

ファイルから文字列を取得することはできているのですが、
それを貼付することができません。


引用解決済
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

MFCを使っているのなら、CWnd::SetDlgItemText()がラクです。
MFCを使っていないなら、::SetDlgItemText()がいいと思います。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

...おっと、「メモ帳などの」ですか?

「あるボタン」のあるアプリケーションとは別のソフトウェアに対して、ということですか?


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

クリップボードに貼り付けて、対象となる別のソフトに、Ctrl+Vのキーのメッセージを投げる
とかはできないのかな?
#単なる思いつきです。できないかもしれません。識者の方、フォローよろしくお願いします。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

思うに汎用性を考えるならクリップボードにコピーするところまで
そのソフトで行うようにして貼り付けたい位置にカーソルを持っていくのと
Ctrl+Vを押すのはユーザーにやらせても良いような気もしますね。
その方が汎用性が高そうです。
Ctrl+Vを投げるにしても
アプリのメインウインドウのウインドウハンドルがわからないと投げられないと
思うのでそのウインドウを特定する為の情報が必要になりますから。


返信引用
AMY
 AMY
(@AMY)
ゲスト
結合: 19年前
投稿: 2
Topic starter  

遅くなりましたが返答して頂きありがとうごさいました。
クリップボードを使うため以下の様に書きました。
----------------------------------------------------
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を行うと

あいうえお

と出力されます。どこかおかしい所がありますか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> どこかおかしい所がありますか?

1.ループの中で SetClipboardData と EmptyClipboard を繰り返し呼んでいます。
 せっかくセットしたデータを、次のループでクリアしてしまっています。

2.teikeibun は 256 バイトなのに、GlobalAlloc では 128 バイトしか
 確保していません。

3.GMEM_SHARE は指定しても意味がありません。

4.GlobalFree していません。

しかしなぁ…
> ABCDEABCDEABCDE
こうなる理由はわかんないなぁ。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

lstrcpy()をlstrcat()にしてみては?


返信引用
tib
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

で、↑のGlobalAlloc()とかはloopの外に出しちゃうとか。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

私なら、クリップボードに転送する文字列を予め作成しておき、
クリップボードへの転送は1回で済まします。

クリップボードは、システム共有なので、共有資源をループで
占有していまうことは、なるべく避けた方が良いと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました