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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
