Q&A

  • 정녕 Shift + Left mouse Click을 흉내낼 수 없단 말입니까~~
mouse_event, keybd_event를 가지고

shift키를 누른 상태에서 Left Mouse Click을 하는 행위를

프로그램에서 강제로 하게 만들수 없는건지요?

얼마전에 질문 올렸는데 대답이 없어 이렇게 다시 올립니다.

그럼..즐파이 하시구여~~~~~
5  COMMENTS
  • Profile
    홍성락 2003.01.29 19:44
    아래 예는 메모장에서 Ctr+del를 누른 효과 만든겁니다.
    아래에서 VK_CONTROL 대신 VK_SHIFT를 사용한후
    SendMessage(Memo1.Handle,WM_KEYDOWN,VK_DELETE,0);를 마우스 좌측 클릭 메세지를 사용한후 SHIFT를 해제하시면 될것 같은데요
    procedure TForm1.Button1Click(Sender: TObject);
    var
      pKeyboardState : ^TKeyboardState;
    begin
        New(pKeyboardState);
        GetKeyboardState(pKeyboardState^);     //초기 상태 구함
        pKeyboardState^[VK_CONTROL] := $80;    //Ctr키를 누를 상태로 설정
        SetKeyboardState(pKeyboardState^);

        SendMessage(Memo1.Handle,WM_KEYDOWN,VK_DELETE,0); //Ctr+del를 누른 효과

        pKeyboardState^[VK_CONTROL] := $0;     //Ctr키를 누를 상태해제
        SetKeyboardState(pKeyboardState^);
    end;

    hsr///////////////////////////////////////
  • Profile
    김준경 2003.01.29 21:31
    답변 감사함다. 그런데...

    음.. 일반적인 윈도 어플에서는 sendmessage로 해결이 돼는데요..
    혹시..DirectX같은곳 ( 가령 게임에 ㅋㅋㅋ) 보낼려면.. SendMessage로는
    안돼거던요.. 할수 없이 keybd_event, mouse_event를 써서 하는데..

    음.. 이것이 문제네요..SendMessage는 게임같은 프로그램에서는 안돼더군요. ㅠㅠ;


  • Profile
    소울해커 2003.02.02 01:57

    DirectX를 사용하는 게임과 같은 프로그램에선
    이미 모든 키보드 제어권을 넘겨 받은 상태라서
    일반적인 키보드 메세지 처리방법으로는 무리입니다.
    그럼 프로그램에 메세지를 보내기 위해선
    Hook 함수를 이용하시면 가능합니다.
    헌데 Hook 함수를 사용할 경우 키조합간의 처리에 대해선...
    음... 글쎄요...
    수련이 많이 부족한터라...
  • Profile
    전정윤 2006.04.12 19:17
    Keybd_Event(VK_SHIFT, MAPVIRTUALKEY(VK_LSHIFT, 0), KEYEVENTF_EXTENDEDKEY, 0);
    Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    Sleep(1);
    Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    Keybd_Event(VK_SHIFT, MAPVIRTUALKEY(VK_LSHIFT, 0), KEYEVENTF_KEYUP, 0);

    이런 식으로 하면 되지 않을까요.



  • Profile
    박귀남 2006.05.28 22:16

    //----

    타이머를 이용해보세요
    타이머가 일반 api 함수보다 인터럽트우선순위가 더 높죠???
    간단한예제인데 키값과 스켄코드를 다 집어 넣고 해보심....

    var

      KeyType, ScanCode : Byte;

    procedure TForm1.KeyStroc(Key : Byte; bScan : Byte);
    begin
      KeyType := key;
      ScanCode := bScan;
      KeyDown.Enabled := True;
    end;

    procedure TForm1.KeyDownTimer(Sender: TObject);
    begin
      Keybd_event(KeyType, ScanCode, 0, 0);
      KeyUp.Enabled := True;
      KeyDown.Enabled := False;
    end;

    procedure TForm1.KeyUpTimer(Sender: TObject);
    begin
      Keybd_event(KeyType, ScanCode, KEYEVENTF_KEYUP, 0);
      KeyUp.Enabled := False;
    end;