ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 22:51

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2006年5月15日(月) 21:52 
(ソフトを起動してる間)リアルタイムにクリップボードを自動監視し、クリップボードの内容(ただの文字列)が変わる度にEditBox1に出力したいのですが、どうやったら良いのでしょう?


通報する
ページトップ
   
投稿記事Posted: 2006年5月15日(月) 22:51 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
> (ソフトを起動してる間)リアルタイムにクリップボードを自動監視し、クリップボードの内容(ただの文字列)が変わる度にEditBox1に出力したいのですが、どうやったら良いのでしょう?
これはActiveBasicのヘルプファイルを作る時にコードを書いたんですけど、情報を探すのがやたらと面倒くさかった記憶があります。

説明も面倒なのでコードをドカ載せします...でもコメントかなり飛ばしてます...。
詳しく知りたい場合は、
「ChangeClipboardChain」「SetClipboardViewer」「GetClipboardViewer」
「WM_DRAWCLIPBOARD」「WM_CHANGECBCHAIN」
と検索してみてください。


通報する
ページトップ
投稿記事Posted: 2006年5月15日(月) 23:01 
定期的にクリップボードを監視する
指定したいデータ形式を保存しておく
新しいデータか判定する

以下、アクティブベーシックのヘルプから引用しました。

Win32API: GetClipboardData
クリップボードから指定したデータ形式のデータを取得します。


--------------------------------------------------------------------------------
定義
Declare Function GetClipboardData Lib "user32" _
(uFormat As DWord) As HANDLE
uFormat
取得するデータの形式を指定します。以下の定数を利用することができます。
定数 説明
CF_BITMAP ビットマップ データ(ビットマップ ハンドル)です。
CF_DIB BITMAPINFO構造体とビット配列からなるビットマップデータです。
CF_DIF Software Arts 社の DIF データ交換形式です。
CF_DSPBITMAP プライベートな形式のビットマップデータです。
CF_DSPENHMETAFILE プライベートな形式の拡張メタファイルデータです。
CF_DSPMETAFILEPICT プライベートな形式のメタファイル画像表示形式データです。
CF_DSPTEXT プライベートな形式のテキストデータです。
CF_ENHMETAFILE 拡張メタファイルのデータ(enhanced metafile ハンドル)です。
CF_GDIOBJFIRST(&H0300) ~ CF_GDIOBJLAST(&H03FF) GDI オブジェクトによって表現される、アプリケーション定義のクリップボード形式です。
CF_HDROP ファイルドロップ形式です。
CF_LOCALE テキストデータのロケール ID ハンドルです。
CF_METAFILEPICT METAFILEPICT 構造体のメモリオブジェクトです。メタファイル画像形式です。
CF_PALETTE カラーパレットのハンドルです。
CF_PENDATA Windows のペン拡張機能のためのデータです。
CF_PRIVATEFIRST(&H0200) ~ CF_PRIVATELAST(&H02FF) プライベートなクリップボード形式です。
CF_RIFF RIFF 形式の音声データです。
CF_SYLK Microsoft シンボリックリンク (SYLK) 形式のデータです。
CF_TEXT テキスト形式のデータです。各行は復帰改行 (CR-LF) コードで終わります。データの終端は NULL 文字です。この形式は、ANSI テキストに使います。
CF_WAVE WAVE 形式の音声データです。
CF_TIFF TIFF 形式の画像データです。
CF_UNICODETEXT Unicode のテキスト形式です。各行は復帰改行 (CR-LF) コードで終わります。データの終端は NULL 文字です(WindowsNT系OSのみ)。

戻り値

関数が成功すると、データが格納されているメモリ オブジェクトのハンドルが返ります。失敗すると、NULL が返ります。

解説

この関数を呼び出す前に、OpenClipboard関数を使用してクリップボードをオープンしておく必要があります。
取得したメモリ オブジェクトは、GlobalLock関数を使用して参照することができるようになります。

環境情報

インクルード ファイル: api_window.sbp 内で定義済み
DLLファイル: user32.dll



--------------------------------------------------------------------------------
OpenClipboard関数、SetClipboardData関数、GlobalLock関数


通報する
ページトップ
   
投稿記事Posted: 2006年5月15日(月) 23:53 
7さん、ゲストさんどうも有難う御座います。
今夜はもう遅いんで明日の夜にでも試してみます。


通報する
ページトップ
   
投稿記事Posted: 2006年5月16日(火) 17:52 
早速コードを実行してみました。
コピーを繰り返すと新たにコピーした文字列が上書きされてしまうのですが、"追加"でどんどんと言う風にはならないでしょうか?^^;

又、ボタン1を押せばクリップボード監視を停止としたい場合どうしたら良いのでしょうか?

後、7さんの書いて頂いたコード中の
 If hMem Then ってどんな条件分岐なんですか?
もしもグローバルオブジェクトメモリ ハンドルが?!

何がどうなったら・・・と言うのが全くわからないので^^;


通報する
ページトップ
   
投稿記事Posted: 2006年5月16日(火) 22:05 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
> コピーを繰り返すと新たにコピーした文字列が上書きされてしまうのですが、"追加"でどんどんと言う風にはならないでしょうか?^^;
そうですね。文字列を設定してしまうので追加って感じじゃないですね。
文字列を設定せずに追加するような処理に替えます。 > 又、ボタン1を押せばクリップボード監視を停止としたい場合どうしたら良いのでしょうか?
すいません。実装しようとしたら全体的にコードが変わってしまいました。新しく載せます。
ちなみに、クリップボードの監視を始めるには、SetClipboardViewer()関数、終了するには、ChangeClipboardChain()関数を使います。 別にクリップボードの監視に詳しい訳じゃないので、動いてるんですけどなんか問題あるかもしれません...。

>  If hMem Then ってどんな条件分岐なんですか?
> もしもグローバルオブジェクトメモリ ハンドルが?!
言葉に直すなら「グローバルオブジェクトメモリハンドルが FALSE じゃないなら」って感じでしょうか。
「グローバルオブジェクトメモリハンドルが TRUE なら」とは違うので注意が必要です。
そういえば自分もプログラミングを始めた頃、同じように意味が分からなくて困ったことがありました!


通報する
ページトップ
投稿記事Posted: 2006年5月16日(火) 22:43 
7さん、どうも有難う御座いますm(_ _)m
期待通りの動作で感激しました♪
文字列の追加方法を最初書いて頂いたソースに自分なりにあれこれと模索してたのですが、コンパイルでエラーが多発してしまってまして…
今回のソースを元に何とか工夫して自分の目指す物を作ってみたいと思います。

>言葉に直すなら「グローバルオブジェクトメモリハンドルが FALSE じゃないなら」って感じでしょうか。
>「グローバルオブジェクトメモリハンドルが TRUE なら」とは違うので注意が必要です。
折角説明して頂いてもイマイチ理解出来ないです^^;
自分で早く使える(理解する)様になりたいですね
(FALSEじゃないなら、TRUEじゃないの???と思ってみたり)


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月16日(火) 23:03 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
TRUE/FALSEというよりもNULLかそうでないかという感じです。
GetClipboardの戻り値の説明に「失敗すると、NULL が返ります」と書いてあります。
If hMem ThenはIf hMem <> 0 Thenと等価です。(NULL = 0)

つまりGetClipboardDataが成功したかどうかを確かめる手段として
「hMemがデータを保持しているかどうか」をIfで問うているのです。

ちなみにNULLとは空と言う意味です。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月16日(火) 23:32 
> TRUE/FALSEというよりもNULLかそうでないかという感じです。
> GetClipboardの戻り値の説明に「失敗すると、NULL が返ります」と書いてあります。
> If hMem ThenはIf hMem <> 0 Thenと等価です。(NULL = 0)
あ、成る程!!そう言う式が隠れてるんですね!!

> つまりGetClipboardDataが成功したかどうかを確かめる手段として
> 「hMemがデータを保持しているかどうか」をIfで問うているのです。
>
> ちなみにNULLとは空と言う意味です。
お陰様でやっとすっきりと出来ました。
イグトランスさん、わかり易い説明有難う御座いました。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Amazon [Bot] & ゲスト[16人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean