C#으로 클립보드 관리자를 만들고 있는데 가끔 일부 애플리케이션에서 클립보드가 비어있는 상황이 발생합니다.
예를 들어 Excel에서 방금 복사한 항목을 선택 취소할 때 이런 일이 발생하므로 클립보드가 비어 있는지 확인해야 합니다. 그런데 클립보드를 업데이트한 애플리케이션의 이름을 어떻게 알 수 있나요?
다음 코드를 사용하여 클립보드를 업데이트하는 애플리케이션에 대한 hwnd
핸들을 얻을 수 있으면 그 뒤에 있는 프로세스를 찾을 수 있었으면 좋겠습니다.
message
객체에 message
对象中的 hwnd
를 사용할 수 있었으면 좋겠지만 이것은 내 애플리케이션인 것 같습니다. 아마도 이 프로세스 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를 호출하기 전에 애플리케이션이 클립보드를 열어야 합니다. 오픈클립보드 기능을 사용합니다. 응용 프로그램이 지정하는 경우 클립보드를 열 때 창 핸들이 null이고, 빈클립보드가 성공합니다. 그러나 클립보드 소유자를 null로 설정합니다. 이 결과는 다음과 같습니다. 클립보드 데이터 설정이 실패했습니다.
▶ 여기서는 nativewindow 파생 클래스를 사용하여 클립보드 리스너를 설정합니다. 클립보드 업데이트 메시지를 처리하는 창은 createparams 개체를 초기화하고 이 매개변수를 invisible 창을 만드는 데 사용되는 nativewindow.createhandle(createparams) 메서드에 전달하여 생성됩니다.
그런 다음 초기화된 기본 창의 wndproc
,接收 wm_clipboardupdate
알림을 다시 작성하세요.
addclipboardformatlistener 함수는 시스템 클립보드 리스너 체인에 창을 배치하는 데 사용됩니다.
▶ clipboardupdatemonitor
类在收到剪贴板通知时生成一个事件。事件中传递的自定义 clipboardchangedeventargs
对象包含由 getclipboardowner()
getwindowthreadprocessid()에 의해 반환된 클립보드 소유자에 대한 핸들과 process.getprocessbyid()에 의해 반환된 프로세스 이름입니다.
다음과 같이 clipboardupdatemonitor
개체를 설정할 수 있습니다.
이 클래스는 program.cs
사용자 정의 eventargs
클립보드 소유자에 대해 수집된 정보를 전달하는 개체:
nativemethods
카테고리:
위 내용은 클립보드를 업데이트하는 애플리케이션의 프로세스 ID나 이름을 어떻게 얻을 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!