특정 클래스 유형 ("VSDebugger CDataTipWnd")을 사용하여 창을 만들려고하지만 CreateWindowEx를 실행할 때 실패하고 GetLastError가 클래스를 찾을 수 없다고 알려줍니다. 여기에 참조 할 수 있도록 코드는 문제가되지해야하지만,이다 :CreateWindowEx가 ERROR_CANNOT_FIND_WND_CLASS와 함께 실패합니다.
const Win32WindowStyles dwStyle = Win32WindowStyles.WS_POPUP;
IntPtr wnd = NativeMethods.CreateWindowEx(0L, "VSDebugger CDataTipWnd", "MyWindow",
dwStyle, 100, 100, 100, 100, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
을 내가 플러그인 과정에서 같이 실행하고 나는 (내가있는 녀석 전에이 클래스의 윈도우가 생성 될 것을 알고있다 Winspector/Spy ++ 사용), 아직이 유형의 창을 직접 만들려고해도 작동하지 않으며 이유를 찾을 수 없습니다.
documentation은 "클래스 이름은 RegisterClass 또는 RegisterClassEx로 등록 된 모든 이름이 될 수 있습니다. 단, 클래스를 등록하는 모듈도 또한 창을 만드는 모듈이어야합니다. 클래스 이름은 사전 정의 된 시스템 클래스 이름 목록을 보려면 시스템 클래스 이름 목록을 참조하십시오. " RegisterClass가 실제로 다른 모듈 (dll/exe)에서 만들어 졌을 가능성이 있습니까? 다른 모듈에 클래스를 생성하는 것만으로도 다른 모듈의 이름으로 액세스 할 수 없습니까 ?? 그렇다면, 그 클래스를 어떻게 든 찾아 내서 창을 만들 수 있습니까?
감사합니다. Vitaly
오른쪽에 대해 소리, 감사합니다! 나는 그것을 밖으로 시도 할 것이다. – VitalyB
GetModuleHandle (null)을 사용하면 작동하지 않는 것 같습니다 ... 모든 모듈을 열거하고 올바른 모듈을 찾으려고합니다. 더 좋은 방법이 없을까요? 어떤 모듈이 클래스 X를 생성했는지 프로세스를 묻는 것처럼? – VitalyB
화면에 창 클래스의 인스턴스가 표시되면 Visual Studio와 함께 제공되는 Spy ++ 도구를 사용하여 해당 창을 찾습니다 (십자선을 끌어서 놓기 만하면 찾을 수 있습니다). 그런 다음 클래스를 살펴보십시오 탭에서 Instance Handle을 알려줍니다. 프로세스 탐색기로 전환 한 다음 프로세스를 선택하고 DLL보기 (아래쪽 패널)를 켜면 Base 열이 같은 번호를 나타내는 DLL이어야합니다. (프로세스 탐색기는 숫자를 채우지 않으므로 예를 들어 0x600000은 0x6000000과 쉽게 혼동됩니다.) 코드에서 핸들에 해당 DLL에 LoadLibrary를 시도하십시오 –