마우스 버튼을 사용하여 델파이 SendInput을 시뮬레이션

이 문서는 원래 프로그래밍 포럼, 문서 주소에 출판되었다 : http://programbbs.com/bbs/view12-17219-1.htm , 관련 문서는 페이지의 위의 주소에서 다운로드 할 수 있습니다. 재판 소스를 표시하시기 바랍니다.

머리말

  발행 ( "델파이 WinIo 마우스 키보드 설명하여 시뮬레이션" http://programbbs.com/bbs/view12-17207-1.htm을 ), 후 비교를 위해 키보드와 마우스 SendInput을 시뮬레이션을 사용하여 프로그램을 보낼 수 있습니다.

一, SendInput을

  SendInput을 마우스와 키보드는 시스템 메시지 큐에 메시지를 지정할 수 있습니다 마우스와 키보드의 아날로그 있도록. 차폐 된 SendInput을하는 많은 프로그램이 전부는 아니지만,이 있습니다. 그래서 여기 당신의 SendInput을를 사용하는 것입니다. 나는 유닛 파일에 기록 된 주요 아날로그 기능을 가지고 : SIMouseKeyboard.pas는, 마우스를 시뮬레이션하기 위해 유닛 파일 관련 함수를 호출하고 키보드가 달성 될 수있다. 유닛 파일의 바닥의 끝을 볼 다운로드합니다. SendInput을 인수는 다음과 같이 Windows.pas 기능의 문이있다, 매우 간단합니다 :

함수 SendInput을 (cInputs : UINT, VAR의 pInputs : TInput; cbSize : 정수) UINT; stdcall을;

  cInputs : 기록 배열 정의 pInputs 요소의 수. pInputs : 기록 요소 배열 TInput의 첫 번째 유형. 각 요소는 시스템 메시지 큐 키보드 또는 마우스 이벤트에 삽입 나타냅니다. cbSize : TInput 정의 크기, 일반적 인 SizeOf (TInput). 기능은 시스템 메시지 큐 삽입 성공 이벤트의 수, 그렇지 않은 경우 0을 반환합니다. 다음과 같이 호출 SendInput을 키는 레코드 구조의 여러 가지의 의미를 파악하는 것입니다, Windows.pas에 TInput에 선언

tagINPUT = 포장 된 기록
    ITYPE : DWORD;
    경우 정수
      0 (MI : TMouseInput);
      1 : (KI : TKeybdInput);
      2 : (HI : THardwareInput);
종료;
TInput = tagINPUT;

  상기 MI는 KI 안녕하세요 세 레코드 구조의 일반적인 형태는 세 개의 값이 사용 레코드 구조 ITYPE의 종류를 나타내는 것이다. INPUT_MOUSE : MI 표시 레코드 구조 무시 KI 및 하이; INPUT_KEYBOARD : KI 표시 레코드 구조 및 무시 마일 하이.

둘째, 키보드 에뮬레이션

  다음과 같이 문 TKeybdInput 기록 구조는 다음과 같습니다

tagKEYBDINPUT = 포장 된 기록
    wVk : WORD;
    wScan : WORD;
    dwFlags : DWORD;
    시간 : DWORD;
    dwExtraInfo : DWORD;
종료;
TKeybdInput = tagKEYBDINPUT;

  WVk는 상기 가상 키는 키 코드를 조작한다. wScan는 일반적으로하지 않습니다, 보안 코드입니다. 키보드 키를 누를 때 0을 나타내는 경우, 키가 KEYEVENTF_KEYUP 방출을 나타낸다 의한 지정 조작을 dwFlags. 타임 스탬프, 값을 반환의 GetTickCount API 함수를 사용할 수 있습니다. dwExtraInfo는, 확장 정보 인 API 함수 GetMessageExtraInfo 반환 값을 사용할 수 있습니다. 다음과 같이 절차의 예를 들어 키 입력 "A"의 경우입니다 :

절차 KeyPressA;
VAR의
    입력 : 배열 [0..1]의 TInput;
시작
    입력 [0]을 .Itype = INPUT_KEYBOARD;
    입력이 [0] .ki 할일
    시작
        wVk를 = VK_A;
        wScan = 0;
        dwFlags = 0;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    입력 [1] .Itype = INPUT_KEYBOARD;
    입력을 가진 [1] .ki 할일
    시작
        wVk를 = VK_A;
        wScan = 0;
        dwFlags = KEYEVENTF_KEYUP;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    SendInput을 (2, 입력 [0] 인 SizeOf (TInput));
종료;

  참고 : Windows.pas 장치는 가상 숫자 키 코드를 선언하지 않습니다, 나는 문자, 숫자 및 문장 부호를 포함하여 모든 가상 키 코드의 유닛 파일은 한 SIMouseKeyboard.pas 다시 문을 썼다.

셋째, 마우스 에뮬레이션

  다음과 같이 성명 TMouseInput 기록 구조는 다음과 같습니다

tagMOUSEINPUT = 포장 된 기록
    DX : Longint와;
    DY : Longint와;
    mouseData : DWORD;
    dwFlags : DWORD;
    시간 : DWORD;
    dwExtraInfo : DWORD;
종료;
TMouseInput = tagMOUSEINPUT;

  DX는 DY 마우스 이동, 마우스 이동 (화소하지 단위)의 좌표 사이의 차이이고 유효하다. 마우스 휠은 mouseData 값 때 마우스 휠 효과가있다. 아래로 스크롤 할 때까지 스크롤 할 때 mouseData 0 mouseData 미만 0보다 크면, mouseData의 절대 값은 일반적으로 120으로 설정. 마우스 지정 동작이 수행 dwFlags, 예컨대 MOUSEEVENTF_MOVE 마우스를 이동 나타내고 MOUSEEVENTF_LEFTDOWN가 눌러 마우스 왼쪽 버튼을 의미 MOUSEEVENTF_LEFTUP 마우스 버튼을 놓으면 나타낸다. 타임 스탬프, 값을 반환의 GetTickCount API 함수를 사용할 수 있습니다. dwExtraInfo는, 확장 정보 인 API 함수 GetMessageExtraInfo 반환 값을 사용할 수 있습니다. 예를 들어, 다음과 같이 마우스 왼쪽 버튼 절차는 클릭

절차 MouseClick과;
VAR의
    입력 : 배열 [0..1]의 TInput;
시작
    입력 [0] .Itype = INPUT_MOUSE;
    입력이 [0]이 어떻게 .mi
    시작
        DX = 0;
        DY = 0;
        mouseData = 0;
        dwFlags = MOUSEEVENTF_LEFTDOWN;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    입력 [1] .Itype = INPUT_MOUSE;
    입력을 가진 [1]은 .mi 수행
    시작
        DX = 0;
        DY = 0;
        mouseData = 0;
        dwFlags = MOUSEEVENTF_LEFTUP;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    SendInput을 (2, 입력 [0] 인 SizeOf (TInput));
종료;

  마우스 이동하지 픽셀 DX, DY보다도 항상 복잡하지만 부와 마우스 장치의 움직임의 양, 그들은 마우스 이동 속도 설정 사이의 비율에 의해 영향을 받는다. 나는 특정 솔루션 여기에 반복되지에서 논의 종이 "마우스와 키보드 시뮬레이션을 사용하여 델파이에서 설명 WinIo"이있다. dwFlags는 가능한 마우스를 이동시키기위한 다른 방법을 사용할 수있게하는 플래그가 제공 될 수있다 MOUSEEVENTF_ABSOLUTE. dwFlags MOUSEEVENTF_ABSOLUTE 플래그가 설정되면, DX, DY 스크린은 값의 DY를 위치 이동 DX 마우스를 나타내는 좌표. 그러나 이것은 픽셀 단위로 값을 좌표 아니다. 0의 ($ FFFF) 65535 DX가 0 일때의 값 범위, DX 65535 같다 0에 Dy가 동일 화면의 좌측 상단을 대표하고, Dy를 화면에 대응하는 화면의 우측 하단 65535 같다 나타낸다 폭과 높이가 각각 65,536 나누어지는. API 함수 GetSystemMetrics (SM_CXSCREEN)를 화면의 폭으로 돌아갈 수, 기능 GetSystemMetrics (SM_CYSCREEN)는 해당 DX, DY로 전환 될 수있는 화면의 픽셀 좌표를 이용하여 스크린의 높이, 폭 및 높이를 반환한다. 참고 :이 1 픽셀 변환 오류가 가장 발생합니다. 예를 들어 다음과 같이 프로그램으로 마우스 포인터가에서 150,120 화면 좌표 :

절차 MouseMove 이벤트;
var에
    입력 : TInput;
시작
    Input.Itype을 = INPUT_MOUSE을;
    Input.mi 상관
    시작
        * 150 (-1))의 $ FFFF의 DIV (GetSystemMetrics (SM_CXSCREEN) =; DX를
        DY = ($의 FFFF의 DIV (GetSystemMetrics (SM_CYSCREEN) -1)) * 120;
        mouseData = 0;
        dwFlags = MOUSEEVENTF_MOVE 또는 MOUSEEVENTF_ABSOLUTE;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    SendInput을 (1 입력 인 SizeOf (TInput));
종료;

네 SendInput을 WInIo 및 콘트라스트

  기사에서 "델파이에서 마우스와 키보드의 WinIo 자세한 시뮬레이션을 통해"나는 단점 WinIo, SendInput을 이러한 단점이 거의 없음을 많이 말했다했습니다. SendInput을 시뮬레이션 WinIo보다 간단. 이벤트는 시스템의 메시지 큐에 직접 삽입되고, 그래서 WinIo보다 빠릅니다. 이 시스템은 또한 데이터의 무결성을 보장, 데이터 패킷의 혼란이 발생하지 않습니다. 정확한 위치에 마우스 포인터를 이동할 수 있습니다 "절대 운동"의 사용은, 호환성 마우스의 분리의 구성에 문제가되지 않습니다. 가장 치명적인 단점 SendInput을, 일부 프로그램을 차폐됩니다. 그래서 우선 순위 SendInput을 SendInput을하고 WInIo의 경우에 사용할 수 있습니다. 또한 SendInput을 WInIo 사용과 결합 할 수 있습니다, 마우스 왼쪽 버튼을 클릭 민감한 절차 중 일부는, 당신은 마우스 왼쪽 버튼은 다른 SendInput을에 의해 WinIo 시뮬레이션, 시뮬레이션 작업을 클릭하여 사용할 수 있습니다.

다섯, SIMouseKeyboard.pas 사용

  모든 가상 키 코드 재 문은 문자, 숫자의 어떤 문을 포함하지 않으며 구두점 Windows.pas 단위를 표시하기위한 나는 SIMouseKeyboard.pas의 유닛 파일에 있어요. 다음과 같이 구 개 기능의 파일 단위 SIMouseKeyboard.pas 전체적으로 사용 :

1, 절차 SIKeyDown (키 : WORD는 )
  지정된 키를 누르면됩니다. 가상 키 코드의 핵심.

2, 절차 SIKeyUp (키 : WORD )
  지정된 키를 놓습니다. 가상 키 코드의 핵심.

도 3은, 프로 SIKeyPress (키 : WORD , 간격 : 카디날)
  눌 지정된 키, 간격은 누르고 릴리스 사이의 시간 간격이다. 참고 :이 기능은 지원하지 않습니다에 관계없이 어떻게 간격 설정 버튼의 대부분 한 번만의, 기계 인쇄 반복했다.

4, 절차 SIKeyInput (const를 텍스트 : 문자열; 간격 : 추기경)
  시뮬레이션 키보드 입력 지정된 텍스트 및 성공 반환합니다. 텍스트 1 바이트 문자 (~ # 126 # 32), 탭 (# 9) 와 (# 13) 키 입력, 즉, 문자는 문자 수 있고, 키보드로 입력 할 수 있습니다, 다른 문자는 무시됩니다 . 간격 밀리 초 누르고 키 간격을 해제 사이의 시간이다.

데모 프로그램, 다음 키 조합 Ctrl + A :
SIKeyDown (VK_CONTROL); // Ctrl 키를 누른
SIKeyPress (VK_A); // 키 입력
SIKeyUp (VK_CONTROL); // 해제하려면 Ctrl

5, 절차 SIMouseDown (키 : WORD는 )
  마우스 버튼을 지정 누릅니다. 가상 키 코드의 핵심, 바로 VK_RBUTTON에 마우스 왼쪽 버튼 VK_LBUTTON는 채권은 VK_MBUTTON이다.

도 6을 참조하면, 프로 시저 SIMouseUp (키 : WORD ),
  마우스 버튼을 놓으면 지정된다. 가상 키 코드의 핵심, 바로 VK_RBUTTON에 마우스 왼쪽 버튼 VK_LBUTTON는 채권은 VK_MBUTTON이다.

7, 절차 SIMouseClick (키 : WORD ; 간격 : 추기경)
  간격을 누르면 지정된 키 및 릴리스 사이의 시간 간격으로 클릭합니다. 이 문제를 해결할 수있는 간격의 값을 일부 인식되지 프로그램, 적절한 조정이 발생할 수 있습니다 너무 빨리 클릭합니다.

8, 절차 SIMouseWheel (DZ : 정수 ),
  마우스 휠을 스크롤합니다. 아래로 스크롤 할 때 DZ 0보다 큰 때까지 스크롤 DZ는 0 미만이며, DZ의 절대 값은 일반적으로 120으로 설정.

9, 절차 SIMouseMoveTo (X, Y : 정수; MaxMove : 정수; 간격 : 추기경)
  의 특정 위치에 마우스 포인터가 성공을 반환합니다. X 및 Y는 픽셀 값이고, X 및 Y가 이동하는 동안 화면 MaxMove d 배속 및 DY 최대 값을 초과 할 수있는 값의 범위 간격 이동 둘 사이의 시간 간격이며, 일부 프로그램에 민감한 마우스 동작 속도, 마우스가 마우스에 응답하지 않을 때 너무 빨리 움직일 때, 적절한 값 MaxMove을 설정하고 간격이 문제를 해결할 수 있습니다.

: 시연 프로그램은 다음과 같이 특정 위치로 떨어질
눌러 // 마우스 왼쪽 버튼; SIMouseDown (VK_LBUTTON)를
// 지정된 위치로 이동한다 (780,300) SIMouseMoveTo를
SIMouseUp (VK_LBUTTON); // 마우스 버튼을 놓으면

업데이트 (헤세이 (31), 2010) :

  업데이트 SIMouseKeyboard.pas 파일, 이상한 버그. SIMouseKeyboard.pas SendInput을 아날로그 키보드와 마우스는 주로 API 함수를 사용합니다. 일회용 SendInput을 여러 입력을 할 수 있습니다 예를 들어, 다음 코드 :

//模拟输入"A"
절차 KeyPressA;
VAR의
    입력 : 배열 [0..1]의 TInput;
시작
    입력 [0]을 .Itype = INPUT_KEYBOARD;
    입력이 [0] .ki 할일
    시작
        wVk를 = VK_A;
        wScan = 0;
        dwFlags = 0;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    //
    입력 [1] .Itype = INPUT_KEYBOARD;
    입력을 가진 [1] .ki 할일
    시작
        wVk를 = VK_A;
        wScan = 0;
        dwFlags = KEYEVENTF_KEYUP;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    SendInput을 (2, 입력 [0] 인 SizeOf (TInput));
종료;

  두 개의 입력, 언론과 키를 눌렀다의 총. 나는 시스템 (Win2000의)에 몇 가지 패치를 만들어 최근 한 후 그러나, SendInput을 실제로 다중 입력을 지원하지 않습니다로 바뀌 발견, 몇 가지 입력 방법 프로그램을 시도! 첫 번째 인자는 그렇지 않으면 반응 아날로그 입력 1 없어야한다. 문제가 어디에 있는지 이전 테스트는 분명히 정상입니다, 나는 몰라? 다음에 필요한 위의 절차 :

//模拟输入"A"
절차 KeyPressA;
var에
    입력 : TInput;
시작
    Input.Itype을 = INPUT_KEYBOARD;
    Input.ki과는
    시작
        wVk을 = VK_A;
        wScan = 0;
        dwFlags = 0;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    SendInput을 (1 입력 인 SizeOf (TInput));
    //
    Input.Itype = INPUT_KEYBOARD;
    Input.ki과는
    시작
        wVk을 = VK_A;
        wScan = 0;
        dwFlags = KEYEVENTF_KEYUP;
        시간 = GetTickCount를;
        dwExtraInfo = GetMessageExtraInfo;
    종료;
    SendInput을 (1 입력 인 SizeOf (TInput));
종료;

  SIMouseKeyboard.pas 파일에 영향을받는 기능은 난 기능을 수정하고 성공적으로 테스트했습니다 SIKeyInput입니다. 업데이트 된 텍스트 SIMouseKeyboard.pas을 다운로드하려면 아래의 링크를 사용하여

HTTPS : //www.cnblogs.com/rogee/archive/2010/09/14/1827249.html 재현

추천

출처blog.csdn.net/weixin_34343689/article/details/94680838