Q&A

  • 다이렉트 엑스 고수님 보세여..
네.. 안녕하십니까..

흠... 아아... 다이렉트 엑스가..

나를 괴롭게 맹글어서리..

다름이 아니오라 프로젝트 진행중..

키보드를 직접 제어하는 부분에서 머리에 김이 나네여

음.. 자세히 말씀을 드리면 다이렉트 인풋을 사용하여

키보드 버퍼에 직접 원하는 키값을 넣어 주는 곳에서..

막혔습니다.. 다이렉트 엑스는 윈도우의 메세지 처리하고는

별개의 키처리를 하더군여.. 그래서 좀.. 문제가 생겨

이 글을 올립니다. 혹시.. 다이렉트 엑스의 특히

다이렉트 인풋에 고수님께서는 조언 부탁드립니다.

윈도우에서 할수 있는 방법(윈도우 핸들값을 얻어 Post Message, Send Message

KeyBoard_Event)은.. 다 써봤습니다만.. 아하.. 한계에 부딪혔습니다..

음.. 키보드를 직접제어 할수 있는 방법(키보드 버퍼에 직접 키값을 쓸수 있는 방법)좀 부탁합니다. 아니면.. 델파이에서 키보드 인터럽트 쓰는 방법이라두.. 알고 싶어용..

꼭 부탁합니당... 이거 못하면 저 짤려여... 부탁합니다..

시간이 얼마 없습니다.



그럼 즐넷 하세염!!!!!

4  COMMENTS
  • Profile
    도지성 2001.02.27 22:42
    각시탈 wrote:

    > 네.. 안녕하십니까..

    > 흠... 아아... 다이렉트 엑스가..

    > 나를 괴롭게 맹글어서리..

    > 다름이 아니오라 프로젝트 진행중..

    > 키보드를 직접 제어하는 부분에서 머리에 김이 나네여

    > 음.. 자세히 말씀을 드리면 다이렉트 인풋을 사용하여

    > 키보드 버퍼에 직접 원하는 키값을 넣어 주는 곳에서..

    > 막혔습니다.. 다이렉트 엑스는 윈도우의 메세지 처리하고는

    > 별개의 키처리를 하더군여.. 그래서 좀.. 문제가 생겨

    > 이 글을 올립니다. 혹시.. 다이렉트 엑스의 특히

    > 다이렉트 인풋에 고수님께서는 조언 부탁드립니다.

    > 윈도우에서 할수 있는 방법(윈도우 핸들값을 얻어 Post Message, Send Message

    > KeyBoard_Event)은.. 다 써봤습니다만.. 아하.. 한계에 부딪혔습니다..

    > 음.. 키보드를 직접제어 할수 있는 방법(키보드 버퍼에 직접 키값을 쓸수 있는 방법)좀 부탁합니다. 아니면.. 델파이에서 키보드 인터럽트 쓰는 방법이라두.. 알고 싶어용..

    > 꼭 부탁합니당... 이거 못하면 저 짤려여... 부탁합니다..

    > 시간이 얼마 없습니다.

    >

    > 그럼 즐넷 하세염!!!!!





    정확하게 질문의 요지가 파악이 안되어서 정확한 답변은

    드릴 수가 없으나 제가 쓰는 Direct Input class 의 내용은

    다음과 같습니다.





    public

    DirectInputKeyboard : IDirectInputDevice;



    procedure TDxInput.GetKeyState(var KeyState : TKeyState);

    var

    HR : HResult;

    begin

    HR := DirectInputKeyboard.GetDeviceState(SizeOf(KeyState),@KeyState);

    if HR = DIERR_INPUTLOST then DirectInputKeyboard.Acquire;

    end;



    이런식으로 선언되어 있으며 사용할 때는



    var

    KeyState : TKeyState;

    begin

    DxInput.GetKeyState(KeyState);



    if KeyState[DIK_RIGHT] and $80 > 0 then 어쩌구;

    if KeyState[DIK_LEFT ] and $80 > 0 then 어쩌구;

    if KeyState[DIK_UP ] and $80 > 0 then 어쩌구;

    if KeyState[DIK_DOWN ] and $80 > 0 then 어쩌구;



    이런 식으로 사용하고 있습니다.

    ( 물론 DInput 에 대한 초기화는 다 했다치고.. )



    이 이상의 용법이 Direct Input 의 Keyboard device 에서는

    필요하지 않다고 알고 있습니다..



    마치 DOS 때의 port 60h 번의 모든 Keyboard 상태를 읽어서

    배열에다가 저장하는 거랑 동일 합니다.



    그리고 혹시나 DOS 때의 32 bytes 짜리 키버퍼를 생각

    하셨다면 그것은 직접 구현하셔야 할 겁니다..

    ( Queue 방식으로요.. )



    단지 특정한 Application 에 Key 입력 이벤트만 생기게

    할 목적이라면 PostMessage 로 보내 주는 방식이 나을 것

    같아 보입니다..



  • Profile
    각시탈 2001.02.27 23:55
    > 정확하게 질문의 요지가 파악이 안되어서 정확한 답변은

    > 드릴 수가 없으나 제가 쓰는 Direct Input class 의 내용은

    > 다음과 같습니다.

    >

    >

    > public

    > DirectInputKeyboard : IDirectInputDevice;

    >

    > procedure TDxInput.GetKeyState(var KeyState : TKeyState);

    > var

    > HR : HResult;

    > begin

    > HR := DirectInputKeyboard.GetDeviceState(SizeOf(KeyState),@KeyState);

    > if HR = DIERR_INPUTLOST then DirectInputKeyboard.Acquire;

    > end;

    >

    > 이런식으로 선언되어 있으며 사용할 때는

    >

    > var

    > KeyState : TKeyState;

    > begin

    > DxInput.GetKeyState(KeyState);

    >

    > if KeyState[DIK_RIGHT] and $80 > 0 then 어쩌구;

    > if KeyState[DIK_LEFT ] and $80 > 0 then 어쩌구;

    > if KeyState[DIK_UP ] and $80 > 0 then 어쩌구;

    > if KeyState[DIK_DOWN ] and $80 > 0 then 어쩌구;

    >

    > 이런 식으로 사용하고 있습니다.

    > ( 물론 DInput 에 대한 초기화는 다 했다치고.. )

    >

    > 이 이상의 용법이 Direct Input 의 Keyboard device 에서는

    > 필요하지 않다고 알고 있습니다..

    >

    > 마치 DOS 때의 port 60h 번의 모든 Keyboard 상태를 읽어서

    > 배열에다가 저장하는 거랑 동일 합니다.

    >

    > 그리고 혹시나 DOS 때의 32 bytes 짜리 키버퍼를 생각

    > 하셨다면 그것은 직접 구현하셔야 할 겁니다..

    > ( Queue 방식으로요.. )

    >

    > 단지 특정한 Application 에 Key 입력 이벤트만 생기게

    > 할 목적이라면 PostMessage 로 보내 주는 방식이 나을 것

    > 같아 보입니다..

    >



    성의 있는 답변 감사합니다.

    위글에서 "port 60h 번의 모든 Keyboard 상태를 읽어서 배열에다가 저장하는 거랑 동일 합니다." 이부분이 잘 이해가 되질 않네여.. "어쩌구" 부분에서는 그 키에 대한 처리를

    하라는 말씀이신가여? 음.. 구체적으로 얘기하자면 다른 프로그램에서 처리된 키값은 아스키 값으로 가지구 있구요.. 그 키값을 게임으로 넘겨 주면 키값에 따라 처리를

    할려구 합니다. 이 중에서 제가 맡고 있는 것은 게임부분이 아닌 게임으로 키값을 넘겨주는 프로그램을 담당하고 있습니다. 위의 내용은 키보드의 키값을 읽어서 그 키값에 따라 처리되는 부분이 아닌가여? 제가 원하는 것은 다이렉트 인풋을 통해 키버퍼에 키값을

    직접 넣을수 있는 방법을 원합니다... 이궁..

    암튼.. 성의 있는 답변 감사하구여.. 제가 의문난 부분만.. 좀 설명좀 해주시면

    감사 하겠습니다. 그럼.. 즐넷 하세염...bbb



  • Profile
    도지성 2001.02.28 07:49
    > 성의 있는 답변 감사합니다.

    > 위글에서 "port 60h 번의 모든 Keyboard 상태를 읽어서 배열에다가 저장하는 거랑 동일 합니다." 이부분이 잘 이해가 되질 않네여.. "어쩌구" 부분에서는 그 키에 대한 처리를

    > 하라는 말씀이신가여? 음.. 구체적으로 얘기하자면 다른 프로그램에서 처리된 키값은 아스키 값으로 가지구 있구요.. 그 키값을 게임으로 넘겨 주면 키값에 따라 처리를

    > 할려구 합니다. 이 중에서 제가 맡고 있는 것은 게임부분이 아닌 게임으로 키값을 넘겨주는 프로그램을 담당하고 있습니다. 위의 내용은 키보드의 키값을 읽어서 그 키값에 따라 처리되는 부분이 아닌가여? 제가 원하는 것은 다이렉트 인풋을 통해 키버퍼에 키값을

    > 직접 넣을수 있는 방법을 원합니다... 이궁..

    > 암튼.. 성의 있는 답변 감사하구여.. 제가 의문난 부분만.. 좀 설명좀 해주시면

    > 감사 하겠습니다. 그럼.. 즐넷 하세염...bbb

    >



    port 60h 은 실제로 키보드의 하드웨어적 신호가 PC 로 들어 오는

    port 인데.. Windows 프로그램에서는 알 필요까지는 없습니다.



    그리고 위와 같이 다른 프로그램에서 키값을 처리한 것을 가지고

    있다면 이미 그것은 키보드의 인풋이 아닌 다른 애플리케이션의

    인풋이라고 할 수가 있습니다..



    그렇다면 평범한 애플리케이션끼리의 통신이나 메시지 보내기

    정도의 것으로도 충분히 가능하다고 봅니다.



    그 방법들을 예로 들자면요..



    1. DDE 사용

    -> 델파이 컴포넌트에 있는 DDE server/client 를 사용하여

    DDE 방식으로 딴 애플리케이션에 값을 넘겨 줍니다.



    2. PostMessage 사용

    -> 일반 키보드 메시지나 사용자 정의 메시지를 원하는

    애플리케이션으로 뿌립니다. 그러면 받는 쪽에서는

    마치 키보드 입력이 들어 온 것처럼 WM_KEYDOWM 이나

    (WM_USER+???) 등의 메시지로 받을 수 있습니다.



    3. Memory Mapped I/O

    -> Windows 에서는 애플리케이션 간에 공유하는 메모리 역역을

    파일처럼 다루는 개념이 있습니다.. 여기에 직접 구현하신

    키버퍼를 두고 그 메모리 역역에다가 쓰고 읽기를 하시면

    충분히 위의 것이 구현 가능하리라 봅니다.



    위의 것에 대한 자세한 것은 검색을 해보세요...





  • Profile
    각시탈 2001.03.01 00:56


    도지성 wrote:

    > > 성의 있는 답변 감사합니다.

    > > 위글에서 "port 60h 번의 모든 Keyboard 상태를 읽어서 배열에다가 저장하는 거랑 동일 합니다." 이부분이 잘 이해가 되질 않네여.. "어쩌구" 부분에서는 그 키에 대한 처리를

    > > 하라는 말씀이신가여? 음.. 구체적으로 얘기하자면 다른 프로그램에서 처리된 키값은 아스키 값으로 가지구 있구요.. 그 키값을 게임으로 넘겨 주면 키값에 따라 처리를

    > > 할려구 합니다. 이 중에서 제가 맡고 있는 것은 게임부분이 아닌 게임으로 키값을 넘겨주는 프로그램을 담당하고 있습니다. 위의 내용은 키보드의 키값을 읽어서 그 키값에 따라 처리되는 부분이 아닌가여? 제가 원하는 것은 다이렉트 인풋을 통해 키버퍼에 키값을

    > > 직접 넣을수 있는 방법을 원합니다... 이궁..

    > > 암튼.. 성의 있는 답변 감사하구여.. 제가 의문난 부분만.. 좀 설명좀 해주시면

    > > 감사 하겠습니다. 그럼.. 즐넷 하세염...bbb

    > >

    >

    > port 60h 은 실제로 키보드의 하드웨어적 신호가 PC 로 들어 오는

    > port 인데.. Windows 프로그램에서는 알 필요까지는 없습니다.

    >

    > 그리고 위와 같이 다른 프로그램에서 키값을 처리한 것을 가지고

    > 있다면 이미 그것은 키보드의 인풋이 아닌 다른 애플리케이션의

    > 인풋이라고 할 수가 있습니다..

    >

    > 그렇다면 평범한 애플리케이션끼리의 통신이나 메시지 보내기

    > 정도의 것으로도 충분히 가능하다고 봅니다.

    >

    > 그 방법들을 예로 들자면요..

    >

    > 1. DDE 사용

    > -> 델파이 컴포넌트에 있는 DDE server/client 를 사용하여

    > DDE 방식으로 딴 애플리케이션에 값을 넘겨 줍니다.

    >

    > 2. PostMessage 사용

    > -> 일반 키보드 메시지나 사용자 정의 메시지를 원하는

    > 애플리케이션으로 뿌립니다. 그러면 받는 쪽에서는

    > 마치 키보드 입력이 들어 온 것처럼 WM_KEYDOWM 이나

    > (WM_USER+???) 등의 메시지로 받을 수 있습니다.

    >

    > 3. Memory Mapped I/O

    > -> Windows 에서는 애플리케이션 간에 공유하는 메모리 역역을

    > 파일처럼 다루는 개념이 있습니다.. 여기에 직접 구현하신

    > 키버퍼를 두고 그 메모리 역역에다가 쓰고 읽기를 하시면

    > 충분히 위의 것이 구현 가능하리라 봅니다.

    >

    > 위의 것에 대한 자세한 것은 검색을 해보세요...

    >

    >

    • 이제관
      2001.02.27 04:40
      Project -> View Source에 가셔서 login Form을 ShowModal로 보여주세요 이때 Login Form은 MDI 폼(부...
    • 비기너
      2001.02.27 20:02
      이제관 wrote: > > Project -> View Source에 가셔서 login Form을 ShowModal로 보여주세요 > > 이때...
    • 이제관
      2001.02.28 08:22
      제 소스를 보내니 참조하세요 program SchoolManager; uses Forms, uCheckPassword in 'uCheckPa...
    • free0210
      2001.02.27 04:26
      with TClientSocket.Create(Self) do begin Name:= 'Socket' + IntToStr(Max); OnConnect:= ClientSo...
    • 똘망울
      2001.02.27 19:29
      아래분이 자세히 설명해 주셨네요.. 보통..여러개로 생성된 객체에 대한 확인 Tag인자에 값으로 확인하는...
    • ㅜㅜ
    • 2001.02.27 02:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 권민호
      2001.02.27 02:30
      제가 알고 있는것이 맞는 이름인지는 확실하지 않지만 퀀쿼터네이션이라고 부르는데(스팰링은 잘모름...) ...
    • 한상훈
    • 2001.02.27 01:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2001.02.27 02:09
      안녕하세요. 최용일입니다. 두개의 코드는 완전히 동일한 코드입니다. if문에다가 브레이크포인트걸구 C...
    • 김현
      2001.02.27 09:30
      C:Program FilesBorlandDelphi5DemosThreads 에 예제가 있습니다. 사실 이것만 보고 쓰레드를 쓸 수 있...
    • 두리
    • 2001.02.27 01:12
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 맨~
      2001.02.27 01:27
      두리 wrote: > 비베에선 lostfocus라는 이벤트가 있자나여!!! > > 델파이에서두 이런 기능이 있나여???...
    • 초보.
    • 2001.02.27 01:04
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2001.02.27 01:35
      안녕하세요. 최용일입니다. 델파이에서는 빠른속도를 위하여 레코드형을 4바이트씩 옵티마이징합니다. ...
    • 초보.
      2001.02.27 01:51
      소켓 프로그램하면서,,, 최용일님의 글을 많이 봤습니다.. 엄청난 도움을 받고 있구요. 덕분에 해결했...
    • 정계훈
      2001.02.27 01:59
      안녕하세요. 전에 어디선가 받아놓은 자료인데 한번 보세요... unit Unit1; interface uses W...
    • 김종언
      2001.02.27 00:52
      타이머를 사용하되... 10초후 타이머의 Enable 을 False로 하면.. 10초후엔 타이머 이벤트가 발생하지 않...
    • 지니
    • 2001.02.27 03:26
    • 0 COMMENTS
    • /
    • 0 LIKES
    • pallas
    • 2001.02.26 22:41
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김지엽
      2001.02.26 23:29
      쩝.. 고수도 아닌데 주제넘게 답변하는거 아닌지 모르겠네요. 사실 저도 확실히 아는건 아닙니다만.. 1....
    • purunoon
    • 2001.02.26 22:31
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 써니
    • 2001.02.26 22:05
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이기태
      2001.02.28 10:02
      데이터 유형을 보니까... Group By 로 해결하시려면 고생스러우시겠네요... 아무래도 일종의 크로스탭 ...
    • 임형호
      2001.02.26 22:27
      group by 필드명1, 필드명2 이렇게 적어주면... 필드명1로 그룹한후 다시 필드명2로 그룹합니다. ...
    • 최용일
      2001.02.27 01:42
      안녕하세요. 최용일입니다. TListItems.Count가 Integer형이니까 넣는데는 거의 제한이 없다고 생각해도...
    • 각시탈
    • 2001.02.26 21:24
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 도지성
      2001.02.27 22:42
      각시탈 wrote: > 네.. 안녕하십니까.. > 흠... 아아... 다이렉트 엑스가.. > 나를 괴롭게 맹글어서리.. ...
    • 각시탈
      2001.02.27 23:55
      > 정확하게 질문의 요지가 파악이 안되어서 정확한 답변은 > 드릴 수가 없으나 제가 쓰는 Direct Input cl...
    • 도지성
      2001.02.28 07:49
      > 성의 있는 답변 감사합니다. > 위글에서 "port 60h 번의 모든 Keyboard 상태를 읽어서 배열에다가 저장...
    • 각시탈
      2001.03.01 00:56
      도지성 wrote: > > 성의 있는 답변 감사합니다. > > 위글에서 "port 60h 번의 모든 Keyboard 상태를 읽...
    • 김광섭
      2001.02.27 03:38
      델 초보 wrote: > 제가 할려는게 우편번호를 검색해서 그걸 dbgrid에다 뿌려줄려고 하거든여.. > 근데 거...