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; } }
emptyclipboard 関数は、クリップボードの所有権を割り当てます。 一部の特殊なケースでは、プロセスは空のハンドルを
openclipboard() に渡します。この関数と
emptyclipboard
アプリケーションは emptyclipboard を呼び出す前にクリップボードを開く必要があります openclipboard 関数を使用する。アプリケーションが指定する場合 クリップボードを開くときにウィンドウ ハンドルが null の場合、空のクリップボードは成功します ただし、クリップボードの所有者を null に設定します。これにより、次の結果が得られることに注意してください。 クリップボードデータの設定に失敗しました。
▶ ここでは、nativewindow 派生クラスを使用してクリップボード リスナーを設定しています。クリップボード更新メッセージを処理するウィンドウは、 createparams
オブジェクトを初期化し、このパラメータをnativewindow.createhandle(createparams) メソッドに渡すことによって作成されます。このパラメータは、invisible オブジェクトの作成に使用されます。 # ##窓。
次に、初期化されたネイティブウィンドウの wndproc を書き換えて、wm_clipboardupdate
通知を受け取ります。
addclipboardformatlistener 関数は、システム クリップボード リスナー チェーンにウィンドウを配置するために使用されます。
▶
クラスは、クリップボード通知を受信したときにイベントを生成します。イベントで渡されるカスタム clipboardchangedeventargs オブジェクトには、
getclipboardowner() によって返されるクリップボード所有者へのハンドルと、getwindowthreadprocessid()
によって返されるプロセス名が含まれます。 ##process.getprocessbyid()。
次のように
clipboardupdatemonitor オブジェクトを設定できます:
このクラスは、program.cs
でも初期化できます。
リーリー
リーリー
カスタム
eventargs クリップボード所有者について収集された情報を保持するオブジェクト:
リーリー
ネイティブメソッド
リーリー
以上がクリップボードを更新するアプリケーションのプロセス ID または名前を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。