検索
ホームページJava&#&チュートリアルC++ MFCのプロセス間通信のクリップボードを理解する方法

この記事の内容は、C MFC のプロセス間通信のクリップボードを理解する方法についてです。必要な方は参考にしていただければ幸いです。

#Windows クリップボードは比較的単純なプロセス間通信メカニズムであり、そのオーバーヘッドは比較的小さいです。その実装原理は非常に単純です。実際、これはオペレーティング システムによって維持されるメモリ領域です。
このメモリ領域は別のプロセスに属しませんが、プロセスが必要なときにこのメモリ領域にアクセスできます。がメモリ領域に配置され、別のプロセスがメモリ領域からデータを取得して通信を行うことができます。実装プロセスは、共有メモリ操作とクリップボード操作の 2 つの部分で構成されます。
1. クリップボードの操作
(1) HWND GetClipboardOwner();
関数: クリップボードの現在の所有者を指すハンドルを取得します。
この関数が正常に実行されると、所有するウィンドウが返されます。クリップボードのハンドル。それ以外の場合は、NULL が返されます。

(2) BOOL OpenClipboard(HWND hWndNewOwner);
最初のパラメータ hWndNewOwner は、このパラメータが NULL に設定されている場合、このウィンドウがクリップボードを開くことを意味します。現在のタスクまたはプロセスを含むクリップボードを開きます。クリップボードが正常に開かれた場合、この関数は 0 以外の値を返します。別のプログラムがすでにクリップボードを開いている場合、現在のプログラムはクリップボードを開くことができないため、クリップボードを開くことは失敗し、関数は 0 の値を返します。実際、これは考えてみると簡単に理解できます。クリップボードにはそのようなメモリ領域しかありません。プロセス A はそこにデータを書き込みたいので、そこにデータを書き込む必要はありません。この混乱を解決する方法は、プロセス A がクリップボードにデータを書き込んでいる場合 (プロセス A がクリップボードを開いていると理解できます)、プロセス B はデータをクリップボードに書き込むことができないためです。次に、プロセス B がクリップボードを開くのを失敗させます。したがって、プログラムがクリップボードを開いている場合、クリップボードを開いたプログラムが CloseClipboard 関数を呼び出すまで、他のアプリケーションはクリップボードを変更できません。そして、EmptyClipboard 関数を呼び出した後にのみ、現在のウィンドウはクリップボードを開くことができます。クリップボードがある

(3) BOOL CloseClipboard(void);
プロセスがクリップボードを開いた場合、そのプロセスがクリップボード ハンドルを閉じるために CloseClipboard 関数を呼び出さないと、他のプロセスは開くことができません。クリップボードなので、使用するたびにクリップボードを閉じる必要があります。ここでクリップボードを閉じても、現在クリップボードを開いているプログラムがクリップボードの所有権を失うわけではないことに注意してください。EmptyClipboard 関数を呼び出すプログラムは、別のプログラムがクリップボードの所有権を失うことになります。クリップボード。

(4) HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);
SetClipboardData 関数は、指定されたクリップボード形式でデータをクリップボードに配置するために使用されます。最初のパラメータ uFormat は、CF_BITMAP、CF_TEXT、CF_DIB など、クリップボードに配置されるデータの形式を指定するために使用されます (他の形式については、MSDN を参照してください)。 2 番目のパラメータ hMem は、指定された形式のデータのハンドルを指定するために使用されます。このパラメータが NULL の場合は、プログラムがクリップボード内のデータを要求するまで、プログラムはそのデータを保持することを示します。クリップボード所有権プロセスは、データをクリップボードにコピーします。つまり、指定されたクリップボード形式でデータを提供します。この遅延送信テクノロジについては、後で詳しく説明します。

(5) BOOL IsClipboardFormatAvailable( UINT format );
この関数は、クリップボード上のデータ形式が format で指定された形式であるかどうかを判断するために使用されます。

(6) HANDLE GetClipboardData( UINT uFormat );
この関数は、uFormat で指定された形式に従って、指定された形式でクリップボードに存在するクリップボード オブジェクトへのハンドルを返します。

2. 共有メモリの割り当て
(1) HGLOBAL WINAPI GlobalAlloc( UINT uFlags, SIZE_T dwBytes );
最初のパラメータ uFlags は、メモリの割り当て方法を指定するために使用されます。その値は次のリストに示すとおりです。ただし、クリップボードを使用する場合は、動的なデータ交換を実現する必要があるため、GHND または GMEM_MOVEABLE を使用する必要があります。
GHND GMEM_MOVEABLE と GMEM_ZEROINIT の組み合わせ。
GMEM_FIXED 固定メモリを割り当て、戻り値はポインタになります。
GMEM_MOVEABLE 移動可能なメモリを割り当てます。
GMEM_ZEROINIT メモリ内容を 0 に初期化します。
GPTR これは、GMEM_FIXED と GMEM_ZEROINIT の組み合わせです。
2 番目のパラメータ dwBytes は、割り当てられるバイト数を指定するために使用されます。

(2) HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags);
この関数は再割り当て関数、つまり元のデータ オブジェクト hMem 上のメモリ空間を拡張します。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。
2 番目のパラメータ dwBytes は、再割り当てが必要なメモリのサイズを指定します。
3 番目のパラメータ uFlags は、割り当て方法を指定します (GlobalAlloc 関数を参照)。

(3) SIZE_T WINAPI GlobalSize( HGLOBAL hMem );
この関数は、メモリ ブロックのサイズを返すために使用されます。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。

(4) LPVOID WINAPI GlobalLock( HGLOBAL hMem );
この関数の機能は、グローバル メモリ オブジェクトをロックし、オブジェクトのメモリ ブロックの最初のバイトへのポインタを返すことです。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。

(5) BOOL WINAPI GlobalUnlock( HGLOBAL hMem );
上記の GlobalLock 関数を通じて、このグローバル メモリへのアクセスを取得できます。
ロックとは、このメモリがすでに使用されていることを意味します。プログラムはこのグローバル メモリを使用できなくなります。ロックを解除しなくても、他のプログラムはこのグローバル メモリを使用できなくなります。これはまだグローバル メモリと呼ばれています。したがって、この関数はグローバル メモリ オブジェクトのロックを解除するために使用されます。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。

(6) HGLOBAL WINAPI GlobalFree( HGLOBAL hMem );
この関数は、グローバル メモリ ブロックを解放します。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。

次のサンプル コードは、読者が自分のコンピュータで Ctrl C (クリップボードにデータをコピー) Ctrl V (クリップボードからデータをコピー) を実行することによって、特定のテストを実行することもできます。

以上がC++ MFCのプロセス間通信のクリップボードを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

分散コンピューティングにJavaのRMI(リモートメソッドの呼び出し)を使用するにはどうすればよいですか?分散コンピューティングにJavaのRMI(リモートメソッドの呼び出し)を使用するにはどうすればよいですか?Mar 11, 2025 pm 05:53 PM

この記事では、分散アプリケーションを構築するためのJavaのリモートメソッドの呼び出し(RMI)について説明します。 インターフェイスの定義、実装、レジストリのセットアップ、およびクライアント側の呼び出しを詳述し、ネットワークの問題やセキュリティなどの課題に対処します。

ネットワーク通信にJavaのソケットAPIを使用するにはどうすればよいですか?ネットワーク通信にJavaのソケットAPIを使用するにはどうすればよいですか?Mar 11, 2025 pm 05:53 PM

この記事では、ネットワーク通信のためのJavaのソケットAPI、クライアントサーバーのセットアップ、データ処理、リソース管理、エラー処理、セキュリティなどの重要な考慮事項をカバーしています。 また、パフォーマンスの最適化手法も調査します

Javaでカスタムネットワークプロトコルを作成するにはどうすればよいですか?Javaでカスタムネットワークプロトコルを作成するにはどうすればよいですか?Mar 11, 2025 pm 05:52 PM

この記事では、カスタムJavaネットワーキングプロトコルの作成を詳述しています。 プロトコルの定義(データ構造、フレーミング、エラー処理、バージョン化)、実装(ソケットを使用)、データシリアル化、およびベストプラクティス(効率、セキュリティ、メンテナ

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい