2008-08-18 4 views
1

내 응용 프로그램이 일련의 플러그인 DLL을로드 한 다음 새 창을 만들고이 새 창 핸들을 플러그인에 전달하는 플러그인 프레임 워크를 만듭니다. 플러그인은이 핸들을 사용하여 자체 GUI를 작성할 수 있습니다.부모가있는 창을 만드는 DLL 플러그인이 메시지를 올바르게 처리하지 못합니다.

모든 것이 잘 작동하는 것 같습니다. 유일한 문제는 플러그인 위젯 (예 : 편집 상자)에서 Tab 키를 누를 때 다른 위젯으로 이동하지 않는다는 것입니다. 일부 Windows 메시지가 전달되고 일부 메시지는 전달되지 않는다는 것을 알았습니다. 편집 상자에 입력 할 수 있기 때문에 다른 키에 대한 WM_KEYDOWN 전달 된 있지만이 메시지는 Tab 키를 처리하지 않습니다.

희망 누군가가 힌트를 가지고 있습니다.

저는 CBuilder와 함께 Borland VCL을 사용하고 있습니다.하지만 부모 창을 작성한 방법을 알지 못하기 때문에 이러한 플러그인을 작성하기 위해 WIN32에서 모든 프레임 워크를 사용할 수 있다고 생각합니다.

답변

0

난 당신이 다음 단계를 수행해야합니다 믿습니다

  1. Subclass 당신의 편집 컨트롤 (및 기타 컨트롤이 필요).
  2. 편집 컨트롤의 WndProc에서 WM_KEYDOWN 메시지를 캡처하십시오.
  3. Shift 키가 현재 눌려져 있는지 확인하십시오 (GetKeyState 또는 그 유사).
  4. GetWindow으로 전화하여 편집 컨트롤의 핸들과 GW_HWNDPREV 또는 GW_HWNDNEXT 중 하나를 전환 여부에 따라 전달하십시오. 이렇게하면 포커스를받을 창 핸들을 얻을 수 있습니다.
  5. 전화 SetFocus, 4

은 당신이 진짜 탭 문자를 할 수 있습니다 당신이, 당신의 편집 컨트롤이 여러 줄 수있는 경우를 처리 확인 단계에있어 창 핸들에 나타납니다 통과하는 대신 이동 다음 컨트롤로 이동합니다.

희망 하시겠습니까?

1

실제로 매우 복잡한 문제입니다.

Tab 키를 누르면 포커스가 모달 대화 상자에 속한 경우에만 다른 컨트롤로 포커스가 이동합니다. 실제로 ESC, LEFT, RIGHT, DOWN, UP, TAB과 같은 몇 가지 버튼이 있습니다. 모달 대화 상자 메시지 기능은 특별한 방식으로 처리됩니다. 이러한 키가 모덜리스 대화 상자 또는 다른 창과 비슷한 방식으로 작동하게하려면 메시지 처리 기능을 변경하고 내부에 IsDialogMessage를 사용해야합니다. IsDialogMessage 기능에 대한 자세한 내용은 MSDN에서 더 잘 이해할 수 있습니다. Dialog Boxes 섹션에서도 확인할 수 있습니다.

앞서 언급했듯이 필요에 따라 WS_TABSTOPWS_GROUP 스타일을 설정해야합니다.

행운을 빈다.

0

귀하의 dll과 exes 각각에서 VCL의 인스턴스가 달라지기 쉽습니다. dll의 클래스는 exe 클래스의 클래스와 동일하지 않습니다. 또한 전역 변수 (응용 프로그램, 화면)는 이들간에 공유되지 않습니다. 둘 다 자체 메모리 관리자가 있기 때문에 메모리도 마찬가지입니다.

해결책은 dll과 exe가 VCL 라이브러리와 메모리 관리자를 공유하는 것입니다.저는 BCB 개발자는 아니지만 Delphi 개발자입니다. 델파이에서는 rtl과 vcl을 런타임 패키지로 사용합니다. 어쩌면 당신은 BCB 상당 할 수 있습니다.

0

DLL에는 고유 한 TApplication 개체가 있습니다. 균일 한 키 핸들링을 제공하기 위해

. DLL로드. DLL :: TApplication을 EXE :: TApplication에 할당하십시오. 종료 할 때 반드시 역순으로 수행하십시오.

-

마이클

관련 문제