ホームページ  >  記事  >  バックエンド開発  >  クリップボードを更新するアプリケーションのプロセス ID または名前を取得するにはどうすればよいですか?

クリップボードを更新するアプリケーションのプロセス ID または名前を取得するにはどうすればよいですか?

王林
王林転載
2024-02-12 13:40:06893ブラウズ

クリップボードを更新するアプリケーションのプロセス ID または名前を取得するにはどうすればよいですか?

質問内容

C#でクリップボードマネージャーを作成しているのですが、一部のアプリケーションによってクリップボードが空に設定される状況に遭遇することがあります。

これは、たとえば Excel がコピーしたばかりのものの選択を解除したときに発生するため、クリップボードが空かどうかを判断する必要がありますが、 クリップボードを更新したアプリケーションの名前を取得するにはどうすればよいでしょうか ?

次のコードを使用して、クリップボードを更新するアプリケーションの hwnd ハンドルを何らかの方法で取得でき、その背後にあるプロセスを見つけられることを願っています。 リーリー

hwnd オブジェクトで message を使用できればいいのですが、これは私独自のアプリケーションのようです。おそらく、このプロセス ID を持つ通知アプリケーションです:

他の方法で取得できるのであれば、もちろんそれも全く問題ありませんが、これについて何かご意見があれば幸いです :-)

######解決######

@jimiの答えに基づくと、それは簡単です。元のコードに次の 3 行を追加できます:

[dllimport("user32.dll", setlasterror = true)]
public static extern uint getwindowthreadprocessid(intptr hwnd, out uint lpdwprocessid);
...

protected override void wndproc(ref message m)
{
    switch (m.msg)
    {
        case wm_clipboardupdate:
            // how to get the "handle" hwnd?
            intptr handle = ??? <============= how to get this one ???

            // get the process id from the hwnd
            uint processid = 0;
            getwindowthreadprocessid(handle, out processid);

            // get the process name from the process id
            string processname = process.getprocessbyid((int)processid).processname;

            console.writeline("clipboard update event from [" + processname + "]");
            break;
        }
        default:
            base.wndproc(ref m);
            break;
    }
}
回避策

getclipboardowner() を呼び出して、最後にクリップボードが設定またはクリアされたとき (通知をトリガーした操作) のウィンドウ ハンドルを取得できます。

[...] 一般に、クリップボードの所有者は、最後にデータをクリップボードに入れたウィンドウです。

emptyclipboard 関数は、クリップボードの所有権を割り当てます。 一部の特殊なケースでは、プロセスは空のハンドルを

openclipboard()

に渡します。この関数と
emptyclipboard

関数の備考セクションを読んでください。

アプリケーションは emptyclipboard を呼び出す前にクリップボードを開く必要があります openclipboard 関数を使用する。アプリケーションが指定する場合 クリップボードを開くときにウィンドウ ハンドルが null の場合、空のクリップボードは成功します ただし、クリップボードの所有者を null に設定します。これにより、次の結果が得られることに注意してください。 クリップボードデータの設定に失敗しました。

▶ ここでは、

nativewindow 派生クラスを使用してクリップボード リスナーを設定しています。クリップボード更新メッセージを処理するウィンドウは、 createparams

オブジェクトを初期化し、このパラメータを

nativewindow.createhandle(createparams) メソッドに渡すことによって作成されます。このパラメータは、invisible オブジェクトの作成に使用されます。 # ##窓。 次に、初期化されたネイティブウィンドウの wndproc を書き換えて、wm_clipboardupdate
通知を受け取ります。 addclipboardformatlistener 関数は、システム クリップボード リスナー チェーンにウィンドウを配置するために使用されます。

clipboardupdatemonitor

クラスは、クリップボード通知を受信したときにイベントを生成します。イベントで渡されるカスタム clipboardchangedeventargs オブジェクトには、

getclipboardowner()

によって返されるクリップボード所有者へのハンドルと、getwindowthreadprocessid() によって返されるプロセス名が含まれます。 ##process.getprocessbyid() 次のように clipboardupdatemonitor オブジェクトを設定できます: このクラスは、program.cs

でも初期化できます。 リーリー リーリー カスタム
eventargs クリップボード所有者について収集された情報を保持するオブジェクト: リーリー ネイティブメソッド

クラス:

リーリー

以上がクリップボードを更新するアプリケーションのプロセス ID または名前を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。