>  기사  >  백엔드 개발  >  클립보드를 업데이트하는 애플리케이션의 프로세스 ID나 이름을 어떻게 얻을 수 있나요?

클립보드를 업데이트하는 애플리케이션의 프로세스 ID나 이름을 어떻게 얻을 수 있나요?

王林
王林앞으로
2024-02-12 13:40:06893검색

클립보드를 업데이트하는 애플리케이션의 프로세스 ID나 이름을 어떻게 얻을 수 있나요?

질문 내용

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제