중국시가넷 - 개인 서명 - C++ 후크를 사용하여 마우스를 비활성화하는 방법과 쓰는 방법

C++ 후크를 사용하여 마우스를 비활성화하는 방법과 쓰는 방법

I. 소개

이 기사에서는 글로벌 시스템 후크에 대해 설명합니다. 넷앱. 이를 위해 재사용 가능한 클래스 라이브러리를 개발하고 해당 샘플 프로그램을 만들었습니다 (아래 그림 참조).

너는 이미 시스템 갈고리 사용에 관한 또 다른 문장 한 편을 알아차렸을 것이다. 이 글은 그것과 비슷하지만 중요한 차이가 있다. 이 기사에서는 글로벌 시스템 후크에 대해 설명합니다. 그물, 다른 문장 들은 로컬 시스템 후크만 논의한다. 이러한 아이디어는 비슷하지만 구현 요구 사항이 다릅니다.

둘째, 배경

만약 당신이 Windows 시스템 갈고리의 개념에 익숙하지 않다면, 제가 간단히 설명하겠습니다.

-응? 시스템 후크를 사용하면 특정 Windows 메시지 (예: 마우스 관련 메시지) 를 차단하는 콜백 함수를 삽입할 수 있습니다.

-응? 로컬 시스템 훅은 시스템 훅입니다. 지정된 메시지가 별도의 스레드에 의해 처리될 때만 호출됩니다.

-응? 글로벌 시스템 훅은 시스템 훅입니다. 지정된 메시지가 전체 시스템의 모든 응용 프로그램에 의해 처리될 때 호출됩니다.

시스템 훅의 개념을 소개하는 몇 편의 좋은 문장. 여기서, 나는 더 이상 이런 소개적인 정보를 수집하고 싶지 않다. 나는 단지 독자들에게 아래의 시스템 갈고리에 관한 배경 문장 를 참고하도록 할 뿐이다. 만약 네가 시스템 갈고리의 개념을 잘 알고 있다면, 너는 이 문장 중에서 네가 얻을 수 있는 모든 것을 얻을 수 있다.

-응? 갈고리에 대한 MSDN 도서관 지식.

-응? 디노 에스포시토의 최전방 창구가 걸려 있다. 그물 프레임 워크.

-응? Don Kackman 은 C# 에서 Hook 에 적용했습니다.

이 글에서 논의할 것은 이 정보를 확장하여 글로벌 시스템 갈고리를 만드는 것입니다. 넷클래스입니다. C# 과 DLL 및 관리되지 않는 C++ 를 사용하여 클래스 라이브러리를 개발할 예정입니다. 이러한 목표를 함께 달성할 것입니다.

셋째, 코드 사용

우리가 이 창고를 깊이 연구하기 전에, 우리의 목표를 빠르게 살펴봅시다. 이 문서에서는 글로벌 시스템 후크를 설치하고 후크가 처리하는 이러한 이벤트를 후크 클래스의. NET 이벤트로 공개하는 클래스 라이브러리를 개발할 예정입니다. 이 시스템 후크 클래스의 사용법을 설명하기 위해 C# 으로 작성된 Windows 양식 응용 프로그램에서 마우스 이벤트 후크와 키보드 이벤트 후크를 만듭니다.

이러한 클래스 라이브러리는 미리 컴파일된 두 개의 갈고리인 MouseHook 과 KeyboardHook 을 포함하여 모든 유형의 시스템 후크를 만드는 데 사용할 수 있습니다. 우리는 또한 MouseHookExt 와 KeyboardHookExt 라는 이러한 클래스의 특정 버전을 포함 하 고 있습니다. 이러한 클래스 설정의 모델에 따라 Win32 API 의 모든 15 후크 이벤트 유형에 대한 시스템 후크를 쉽게 만들 수 있습니다. 또한 이 전체 클래스 라이브러리에는 컴파일된 HTML 도움말 파일이 있습니다. 이 파일은 이러한 클래스를 보관합니다. 응용 프로그램에서 이 라이브러리를 사용하기로 결정한 경우 이 도움말 파일을 읽어 보십시오.

MouseHook 클래스의 사용 및 라이프 사이클은 매우 간단합니다. 먼저 MouseHook 클래스의 인스턴스를 만듭니다.

Mousehook = newmousehook (); //mouseHook 은 멤버 변수입니다.

다음으로 MouseEvent 이벤트를 클래스 수준 메서드에 바인딩합니다.

마우스 후크. Mouse event+= 새 마우스 후크. Mouseeventhandler (mousehook _ mouseevent);

// ...

Private void mouse hook _ mouse event (mouse events me event, int x, int y){

Stringsmsg = string.format ("마우스 이벤트:: (,)." , mEvent. ToString (), x, y);

Add text (msg); //텍스트 상자에 메시지 추가

}

마우스 이벤트 수신을 시작하려면 아래 후크만 설치하면 됩니다.

마우스 후크. Installhook ();

이벤트 수신을 중지하려면 이 후크를 제거하면 됩니다.

마우스 후크. Uninstallhook ();

Dispose 를 호출하여 후크를 언로드할 수도 있습니다.

응용 프로그램이 종료될 때 이 갈고리를 제거하는 것이 중요하다. 시스템 후크를 계속 설치하면 시스템의 모든 응용 프로그램에 대한 메시지 처리 속도가 느려집니다. 그것은 심지어 하나 이상의 프로세스를 매우 불안정하게 만들 수도 있다. 따라서 시스템 훅 사용을 마치면 반드시 제거해야 합니다. Dell 은 양식의 Dispose 메서드에 Dispose 호출을 추가하여 샘플 응용 프로그램에서 시스템 후크가 제거될 것이라고 확신합니다.

보호된 오버레이 void Dispose(bool disposing) {

만약 {

만약 (mouseHook! = null) {

마우스 후크. Dispose ();

MouseHook = null

}

// ...

}

}

이 클래스 라이브러리를 사용하는 것이 바로 이런 상황이다. 이 클래스 라이브러리에는 쉽게 확장할 수 있는 두 개의 시스템 후크 클래스가 있습니다.

넷째, 도서관을 짓는다

이 라이브러리에는 두 가지 주요 구성 요소가 있습니다. 첫 번째 부분은 C# 클래스 라이브러리입니다. 응용 프로그램에서 직접 사용할 수 있습니다. 반대로 클래스 라이브러리는 내부적으로 관리되지 않는 C++ DLL 을 사용하여 시스템 후크를 직접 관리합니다. 우리는 먼저 이 C++ 부분을 개발하는 것에 대해 토론할 것이다. 다음으로 C# 에서 이 라이브러리를 사용하여 일반 hook 클래스를 구축하는 방법에 대해 살펴보겠습니다. C++/C# 상호 작용에 대해 논의한 것처럼 C++ 방법 및 데이터 유형이 에 매핑되는 방식에 특히 초점을 맞출 것입니다. NET 메소드 및 데이터 유형.

두 개의 라이브러리, 특히 관리되지 않는 C++ DLL 이 필요한 이유를 알고 싶을 것입니다. 또한 관리되지 않는 코드를 사용하지 않는 이 문서의 배경 섹션에 언급된 두 개의 참조 문장 를 확인할 수 있습니다. 이를 위해 제 대답은 "네! 이것이 내가이 문장 쓰는 이유입니다. " 시스템 후크가 실제로 기능을 구현하는 방법을 고려할 때 관리되지 않는 코드가 필요합니다. 글로벌 시스템을 연결하기 위해 Windows 는 프로세스를 실행하는 각 프로세스 공간에 DLL 을 삽입합니다. 왜냐하면 대부분의 과정은 그렇지 않기 때문입니다. 그물 프로세스, 직접 실행할 수 없습니다. 그물 어셈블리. 관리되지 않는 코드 에이전트가 필요합니다. Windows 는 연결될 모든 프로세스에 삽입할 수 있습니다.

첫 번째는. NET 에이전트를 C++ 라이브러리로 전달하는 메커니즘을 제공하는 것입니다. 이렇게 하면 C++ 언어로 다음 함수 (SetUserHookCallback) 와 함수 포인터 (HookProc) 를 정의할 수 있습니다.

Int setuserhoockcallback (hook proc user proc, UINT hookID)

Typedef void (callback * hookproc) (intcode, WPARAM w, LPARAM l)

SetUserHookCallback 의 두 번째 매개 변수는 후크 유형입니다. 이 함수 포인터는 이를 사용합니다. 이제 C# 을 사용하여 해당 메서드와 프록시를 정의하여 이 코드를 사용해야 합니다. 다음은 우리가 그것을 C# 에 매핑하는 방법이다.

개인 정적 외부 SetCallBackResults

Setuserhoockcallback (hookprocessedhandler hook callback, HookTypes hookType)

보호 위임 void hookprocessedhandler (int code, UIntPtr wparam, IntPtr lparam)

공용 열거 훅 유형 {

JournalRecord = 0,

JournalPlayback = 1

// ...

키보드 LL = 13,

MouseLL = 14

}

먼저 DllImport 속성을 사용하여 추상 기본 후크 클래스인 SystemHook 의 정적 외부 메서드로 SetUserHookCallback 함수를 가져옵니다. 이를 위해 일부 외부 데이터 유형을 매핑해야 합니다. 먼저 함수 포인터로 프록시를 만들어야 합니다. 이는 위의 HookProcessHandler 를 정의하여 수행됩니다. C++ 가 (int, WPARAM, LPARAM) 으로 서명된 함수가 필요합니다. Visual Studio 에서. 그물 c++컴파일러, int 및 C# 에서 동일합니다. 즉, C++ 및 C# 에서 int 는 Int32 입니다. 상황이 항상 그런 것은 아니다. 일부 컴파일러에서는 C++ int 를 Int 16 으로 간주합니다. 우리는 비주얼 스튜디오 (Visual Studio) 를 고집합니다. NET C++ 컴파일러는 이 프로젝트를 구현하기 때문에 컴파일러 차이로 인한 또 다른 정의에 대해 걱정할 필요가 없습니다.

다음으로 C# 에서 WPARAM 및 LPARAM 값을 전달해야 합니다. 이들은 실제로 C++ 의 UINT 및 LONG 값을 가리키는 포인터입니다. C# 에서 uint 및 int 에 대한 포인터입니다. WPARAM 이 무엇인지 잘 모르겠다면 C++ 코드를 마우스 오른쪽 버튼으로 클릭하고 "정의로 이동" 을 선택하여 질의할 수 있습니다. 이렇게 하면 windef.h 에서 정의를 찾을 수 있습니다

//from windef.h:

Typedef UINT _ PTR WPARAM

Typedef LONG _ PTR LPARAM

그래서 우리는 시스템을 선택했습니다. UIntPtr 및 시스템. IntPtr 은 우리의 변수 유형으로 각각 WPARAM 과 LPARAM 유형에 해당하며 C# 에서 사용될 때 사용됩니다.

이제 후크 기본 클래스가 이러한 가져온 메서드를 사용하여 콜백 함수 (프록시) 를 C++- c++라이브러리에서 시스템 후크 클래스의 인스턴스를 직접 호출할 수 있도록 하는 방법을 살펴보겠습니다. 먼저 생성자에서 SystemHook 클래스는 전용 메서드인 InternalHookCallback 의 프록시를 만듭니다. 이는 HookProcessedHandler 의 프록시 서명과 일치합니다. 그런 다음 위에서 설명한 대로 에이전트와 해당 HookType 을 C++ 라이브러리에 전달하여 SetUserHookCallback 메서드를 사용하여 콜백 함수를 등록합니다. 다음은 코드 구현입니다.

공용 시스템 후크 (HookTypes 유형) {

_ type = type

_ processhandler = new hookprocessedhandler (internalhookcallback);

Setuserhoockcallback (_ processhandler, _ type);

}

InternalHookCallback 의 구현은 매우 간단합니다. InternalHookCallback 은 catch-all try/catch 블록으로 래핑하여 추상 메서드 HookCallback 의 호출로만 전달합니다. 이렇게 하면 파생 클래스에서 구현이 단순화되고 C++ 코드가 보호됩니다. 모든 것이 준비되면 이 C++ 후크가 이 메서드를 직접 호출한다는 것을 기억하십시오.

[MethodImpl(MethodImplOptions). NoInlining)]

Private void internalhookcallback (intcode, UIntPtr wparam, IntPtr lparam){

시도하다

잡아 {}

}

우리는 속성 구현 방법을 추가했습니다. 컴파일러에게 이 메서드를 인라인으로 연결하지 말라고 지시합니다. 이것은 선택 사항이 아닙니다. 적어도 try/catch 를 추가하기 전에 필요합니다. 어떤 이유에서인지 컴파일러가 이 방법을 연결하려고 시도하고 있는 것 같은데, 이는 그것을 포장하는 대리인에게 여러 가지 번거로움을 초래할 수 있다. 그런 다음 C++ 레이어가 리콜되고 응용 프로그램이 충돌합니다.

이제 파생 클래스가 특정 HookType 을 사용하여 후크 이벤트를 수신하고 처리하는 방법을 살펴보겠습니다. 다음은 가상 MouseHook 클래스의 HookCallback 메서드 구현입니다.

Protected override void hook callback (intcode, UIntPtr wparam, IntPtr lparam){

If (MouseEvent == null)

Int x = 0, y = 0;;

Mouse events mevent = (mouse events) wparam 입니다. Touint32 ();

스위치 (mEvent) {

사례 마우스 이벤트. 왼쪽 클릭:

GetMousePosition(wparam, lparam, ref x, ref y);

깨뜨리다

// ...

}

Mouse event(me event, new Point(x, y)););

}

먼저 이 클래스는 후크 이벤트를 수신할 때 트리거되는 이벤트 MouseEvent 를 정의합니다. 이 클래스는 WPARAM 및 LPARAM 유형에서 의미 있는 마우스 이벤트 데이터로 데이터를 변환합니다. 넷은 그 사건을 자극하기 전에. 이를 통해 클래스 소비자는 이러한 데이터 구조를 설명하는 것에 대해 걱정할 필요가 없습니다. 이 클래스는 가져온 GetMousePosition 함수를 사용하여 C++ DLL 에서 정의한 값을 변환합니다. 이렇게 하려면 다음 단락의 토론을 참조하십시오.

이 방법에서는, 우리는 누군가가 이 사건을 감청하고 있는지 점검한다. 그렇지 않다면 이 사건을 계속 처리할 필요가 없다. 그런 다음 WPARAM 을 MouseEvents 열거 유형으로 변환합니다. MouseEvents 열거는 C ++ 에서 상응하는 상수와 정확하게 일치하도록 신중하게 구성되었습니다. 이렇게 하면 단순히 포인터 값을 열거 유형으로 변환할 수 있습니다. 그러나 WPARAM 값이 열거 값과 일치하지 않아도 이 변환이 성공한다는 점에 유의하십시오. MEvent 의 값은 정의되지 않은 것입니다 (null 이 아니라 열거 값 범위 내에 있지 않음). 이를 위해 시스템 분석을 부탁드립니다. 열거는 상세한 정의 방법입니다.

다음으로, 수신된 이벤트 유형을 확인한 후 이 클래스는 이벤트를 활성화하고 소비자 마우스 이벤트 유형 및 이벤트에서의 마우스 위치를 알립니다.

마지막으로 WPARAM 및 LPARAM 값의 변환에 주의하십시오. 이러한 변수의 값과 의미는 각 이벤트 유형에 따라 다릅니다. 따라서 각 후크 유형에서 이러한 값을 다르게 해석해야 합니다. 복잡한 C++ 구조와 포인터를 모방하기 위해 C# 을 사용하는 대신 C++ 를 선택했습니다. 예를 들어 이전 클래스는 GetMousePosition 이라는 C++ 함수를 사용했습니다. 다음은 C++ DLL 의 방법입니다.

Bool get mouse position (wparam wparam, LPARAM lparam, int ampx, int ampy) {

Mouse hookstruct * pmousestruct = (mouse hookstruct *) lparam;

X = pMouseStruct-& gt;; Pt.x

Y = pMouseStruct-& gt;; Pt.y

True 를 반환합니다

}

MOUSEHOOKSTRUCT 구조 포인터를 C# 에 매핑하려고 하는 것이 아니라, 필요한 값을 추출하기 위해 임시로 C++ 레이어로 다시 보냅니다. 이 호출에서 일부 값을 반환해야 하기 때문에 정수를 참조 변수로 전달합니다. 이것은 C# 에서 int* 에 직접 매핑됩니다. 그러나 올바른 서명을 선택하여 이 동작을 다시 로드하고 이 메서드를 가져올 수 있습니다.

개인 정적 외부 bool internalgetmouseposition (uintptr wparam, IntPtr lparam, ref int x, ref int y)

정수 인수를 ref int 로 정의하여 C++ 참조를 통해 전달된 값을 얻었습니다. 만약 우리가 원한다면, 우리도 out int 를 사용할 수 있다.

동사 (verb 의 약어) 제한

일부 후크 유형은 전역 후크 구현에 적합하지 않습니다. 현재 제한된 후크 유형을 사용할 수 있는 솔루션을 고려하고 있습니다. 지금까지 이러한 유형을 라이브러리에 다시 추가하지 마십시오. 이러한 유형은 애플리케이션 실패 (일반적으로 심각한 시스템 전체 실패) 를 일으킬 수 있기 때문입니다. 다음 섹션에서는 이러한 제한 사항의 원인과 해결 방법에 대해 중점적으로 설명합니다.

갈고리형. 창 프로시저 호출

갈고리형. CallWindowProret

갈고리형. 컴퓨터 기반 교육

갈고리형. 디버깅

갈고리형. 전망이 유휴하다

갈고리형. 로깅

갈고리형. 로그 재생

갈고리형. GetMessage

갈고리형. 시스템 메시지 필터

여섯째, 두 가지 유형의 후크

이 섹션에서는 일부 훅 유형이 특정 범주로 제한되는 이유를 설명하려고 합니다. 제가 사용하는 용어가 좀 편파적이라면 양해해 주십시오. 나는 아직 이 하위 주제에 관한 어떤 문서도 찾지 못했기 때문에, 나는 스스로 용어집을 만들었다. 또한, 내가 틀렸다고 생각하면 말해줘.

Windows 가 SetWindowsHookEx () 에 전달된 콜백 함수를 호출하면 후크 유형에 따라 호출 방법이 달라집니다. 기본적으로 실행 컨텍스트의 갈고리를 전환하는 것과 실행 컨텍스트를 전환하지 않는 갈고리의 두 가지 경우가 있습니다. 즉, 후크가 배치된 적용 프로세스 공간에서 후크 콜백 함수가 실행되는 경우와 후크가 연결된 적용 프로세스 공간에서 후크 콜백 함수가 실행되는 경우입니다.

마우스 및 키보드 후크와 같은 훅 유형은 Windows 에 의해 호출되기 전에 컨텍스트를 전환합니다. 전체 프로세스는 대략 다음과 같습니다.

1. 응용 프로그램 x 가 포커스를 받고 실행됩니다.

2. 사용자가 다음 키를 누릅니다.

3.Windows 가 응용 프로그램 x 에서 컨텍스트를 인계하고 실행 컨텍스트를 연결된 응용 프로그램으로 전환합니다.

4.Windows 는 훅이 있는 응용 프로그램 프로세스 공간의 key message 매개변수를 사용하여 후크 콜백 함수를 호출합니다.

5.Windows 는 연결된 응용 프로그램에서 컨텍스트를 인계하고 실행 컨텍스트를 다시 응용 프로그램 x 로 전환합니다 .....

6.Windows 는 응용 프로그램 x 의 메시지 대기열에 메시지를 넣습니다 .....

7. 잠시 후 응용 프로그램 X 가 실행되면 자체 메시지 대기열에서 메시지를 꺼내고 내부 버튼 (또는 해제 또는 누르기) 프로세서를 호출합니다.

8. 응용 프로그램 x 가 계속 실행됩니다. ...

예를 들어 CBT hook (창 생성 등) 이 있습니다. ) 는 컨텍스트를 전환하지 않습니다. 이러한 유형의 후크의 경우 프로세스는 대략 다음과 같습니다.

1. 응용 프로그램 x 가 포커스를 받고 실행됩니다.

2. 응용 프로그램 x 가 창을 만들었습니다.

3.Windows 는 응용 프로그램 x 의 프로세스 공간에서 CBT 이벤트 메시지 매개 변수를 사용하여 후크 콜백 함수를 호출합니다 .....

4. 응용 프로그램 x 가 계속 실행됩니다. ...

이것은 왜 어떤 유형의 갈고리가 이 라이브러리 구조와 함께 작동할 수 있는지, 어떤 것은 할 수 없는 이유를 설명해야 한다. 기억하세요, 이것이 바로 도서관이 해야 할 일입니다. 위의 4 단계와 3 단계 다음에 각각 다음 단계를 삽입합니다.

1.Windows 가 후크 콜백 함수를 호출합니다.

대상 콜백 함수는 관리되지 않는 DLL 에서 실행됩니다.

대상 콜백 함수는 해당 관리 호출 에이전트를 찾습니다.

4. 해당 매개변수를 사용하여 관리 에이전트를 실행합니다.

5. 대상 콜백 함수는 지정된 메시지에 해당하는 후크 처리를 반환하고 수행합니다.

세 번째와 네 번째 단계는 후크 유형을 전환하지 않았기 때문에 실패할 운명이다. 세 번째 단계는 응용 프로그램에 적합한 관리 콜백 함수가 설정되지 않기 때문에 실패합니다. 이 DLL 은 글로벌 변수를 사용하여 이러한 관리 에이전트를 추적하고 후크 DLL 은 각 프로세스 공간에 로드됩니다. 그러나 이 값은 후크가 배치된 응용 프로그램 프로세스 공간에서만 설정됩니다. 다른 경우에는 모두 비어 있습니다.

Tim Sylvester 는 그의 문장 Other hook types 에서 * * * 공유 메모리 부분을 사용하면 이 문제가 해결될 것이라고 지적했다. 이것은 사실이지만, Tim 이 지적한 바와 같이, 호스팅된 프록시 주소는 연결된 응용 프로그램을 제외하고는 어떤 프로세스에도 의미가 없습니다. 즉, 의미가 없으며 콜백 함수 실행 중에는 호출할 수 없습니다. 그것은 너에게 폐를 끼칠 것이다.

따라서 컨텍스트 전환을 수행하지 않는 후크 유형에 이러한 콜백 함수를 사용하려면 프로세스 간 통신이 필요합니다.

저는 IPC 의 관리되지 않는 DLL 후크 콜백 함수에서 프로세스 외 COM 개체를 사용해 보았습니다. 만약 네가 이 방법을 주효하게 할 수 있다면, 나는 매우 기쁠 것이다. 나의 시도에 관해서는 결과가 만족스럽지 못하다. 기본적인 이유는 다양한 프로세스와 해당 스레드에서 COM 단위 (CoInitialize(NULL)) 를 올바르게 초기화하기가 어렵기 때문입니다. 이것은 COM 개체를 사용하기 전의 기본 요구 사항입니다.

나는 반드시 이 문제를 해결할 방법이 있다는 것을 의심하지 않는다. 그러나 나는 아직 시도해 본 적이 없다, 왜냐하면 나는 그것들의 용도가 제한되어 있다고 생각하기 때문이다. 예를 들어, 원하는 경우 CBT 후크를 사용하여 창 생성을 취소할 수 있습니다. 너는 이 일을 하기 위해 어떤 일이 일어날지 상상할 수 있다.

1. 후크 콜백 함수가 실행을 시작합니다.

2. 관리되지 않는 훅 DLL 에서 해당 훅 콜백 함수를 호출합니다.

실행은 주 후크 응용 프로그램으로 다시 라우팅되어야합니다.

응용 프로그램은 이러한 생성을 허용할지 여부를 결정해야합니다.

5. 호출은 아직 실행 중인 후크 콜백 함수로 다시 라우팅되어야 합니다.

6. 관리되지 않는 훅 DLL 의 훅 콜백 함수는 기본 훅 응용 프로그램에서 수행할 작업을 수신합니다.

7. 관리되지 않는 훅 DLL 의 훅 콜백 함수는 CBT 훅 호출에 대해 적절한 작업을 수행합니다.

8. 후크 콜백 함수의 실행을 완료합니다.

이것은 불가능하지는 않지만 좋지 않습니다. 나는 이것이 이 라이브러리의 허용과 제한을 둘러싼 갈고리 유형의 신비를 없애길 바란다.

일곱. 기타

-응? 라이브러리 문서: 관리 후크 클래스 라이브러리에 대한 비교적 완전한 코드 문서가 이미 포함되어 있습니다. 이 기능은 문서 작성 구성에서 컴파일할 때 시각적 Studio.NET 을 통해 표준 도움말 XML 로 변환됩니다. 마지막으로 NDoc 를 사용하여 컴파일된 HTML 도움말 (CHM) 으로 변환합니다. 이 도움말 파일을 읽을 수 있습니다. scheme 의 솔루션 브라우저에서 Hooks.chm 파일을 클릭하거나 이 문서와 관련된 다운로드 가능한 ZIP 파일을 찾기만 하면 됩니다.

-응? 지능형 인식 향상: Visual Studio.NET 이 참조 라이브러리 프로젝트에 컴파일된 XML 파일 (NDoc 이전 출력) 을 사용하여 지능형 인식을 향상시키는 방법에 익숙하지 않은 경우 간단히 소개하겠습니다. 응용프로그램에서 클래스 라이브러리를 사용하기로 결정한 경우 라이브러리의 안정적인 빌드 버전을 참조할 위치로 복사하는 것이 좋습니다. 또한 XML 문서 파일 (systemhooks \ managedhooks \ bin \ debug \ Kennedy) 을 복사합니다. ManagedHooks.xml) 을 같은 위치로 이동합니다. 라이브러리에 참조를 추가하면 Visual Studio.NET 은 자동으로 파일을 읽고 이를 사용하여 IntelliSense 문서를 추가합니다. 이것은 특히 이와 같은 타사 라이브러리에 매우 유용합니다.

-응? 단위 테스트: 모든 라이브러리에 해당 단위 테스트가 있어야 한다고 생각합니다. 저는 회사의 파트너 겸 소프트웨어 엔지니어이기 때문에 (주로 in 에서 소프트웨어 단위 테스트를 담당하고 있습니다. 그물 환경), 아무도 놀라지 않을 것입니다. 따라서 ManagedHooksTests 라는 솔루션에서 단위 테스트 프로젝트를 찾을 수 있습니다. 이 단위 테스트를 실행하려면 Harnessit 을 다운로드하여 설치해야 합니다. 이 다운로드는 비즈니스 단위 테스트 소프트웨어의 무료 평가판입니다. 이 단위 테스트에서 이 점에 특히 주의를 기울였습니다. 여기서 메서드의 잘못된 매개 변수로 인해 C++ 메모리 예외가 발생할 수 있습니다. 이 라이브러리는 상당히 간단하지만, 이 단위 테스트는 좀 더 미묘한 상황에서 몇 가지 오류를 발견하는 데 도움이 될 수 있습니다.

-응? 관리되지 않는/호스팅되지 않은 디버깅: 혼합 솔루션 (예: 이 문서의 호스팅 및 관리되지 않는 코드) 에서 가장 까다로운 사항 중 하나는 디버깅입니다. C++ 코드를 통해 또는 C++ 코드에 중단점을 설정하려면 관리되지 않는 디버깅을 시작해야 합니다. 이것은 비주얼 Studio.NET 의 프로젝트 설정입니다. 한 단계로 관리 계층 및 관리되지 않는 계층을 매우 원활하게 디버깅할 수 있지만, 디버깅 중 관리되지 않는 디버깅은 응용 프로그램의 로드 시간 및 실행 속도를 크게 저하시킵니다.

여덟, 마지막 경고

분명히 시스템 후크는 상당히 강력합니다. 그러나 이런 권력의 사용은 책임져야 한다. 시스템 후크에 오류가 발생할 경우 응용 프로그램이 중단될 뿐만 아니라 현재 시스템에서 실행 중인 모든 응용 프로그램을 손상시킬 수 있습니다. 그러나 이 수준에 도달할 가능성은 일반적으로 매우 적다. 그러나, 시스템 갈고리를 사용할 때, 너는 너의 코드를 자세히 검사해야 한다.

응용 프로그램을 개발하는 데 사용할 수 있는 유용한 기술을 발견했습니다. 시스템 훅을 사용하여 Microsoft 의 가상 PC 에 원하는 개발 운영 체제와 시각화 Studio.NET 의 복사본을 설치합니다. 그런 다음 이 가상 환경에서 응용 프로그램을 개발할 수 있습니다. 이렇게 하면 후크 응용 프로그램에 오류가 발생할 경우 실제 운영 체제가 아닌 운영 체제의 가상 인스턴스만 종료됩니다. 이 가상 운영 체제가 후크 오류로 인해 붕괴되었을 때 실제 운영 체제를 다시 시작해야 했지만 자주 발생하는 것은 아닙니다.