2012-10-18 2 views
5

다른 응용 프로그램에서는 델파이 그리드의 셀에 프로그래밍 방식으로 한 문자를 입력해야합니다. 수동으로 수행하기 위해WinAPI를 사용하여 델파이에서 키보드 입력 시뮬레이션하기

는 다음과 같은 단계가 필요합니다 :

  1. 눌러 F3 버튼을 누릅니다.
  2. 오른쪽 화살표 키를 세 번 누릅니다.
  3. 스페이스 버튼을 누릅니다.
  4. 키보드에 'E'문자를 입력하십시오.
  5. 오른쪽 화살표 키를 누릅니다.

    // Press F3 button   
    keybd_event(VK_F3, 0, 0, 0);   
    // Press right arrow key 3 times 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    
    // Press the space button 
    keybd_event(VK_SPACE, 0, 0, 0); 
    
    // Type letter E 
    keybd_event(Ord('E'), 0, 0, 0); 
    
    // Move to the right 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    

그러나 그것은 작동하지 않습니다. 이 코드를 실행하면 아무 일도 일어나지 않는 것 같습니다.

사용자 입력을 실제로 시뮬레이트하도록이 코드를 어떻게 수정해야합니까?

+0

나는''virtual keyboard' (http://stackoverflow.com/a/12565963/960757)에 대해 뭔가를 만들었습니다. (많은 사람들이있을 것입니다.) 그러나 문제가 있다면,'TStringGrid'를 목표로한다면, 집중하고 키 스트로크를 시뮬레이트하는 것 외에는 다른 일을 할 수 없다고 생각합니다 ('TStringGrid'는 어떤 종류의 메시지에도 응답하지 않습니다. 셀의 텍스트를 설정할 수 있어야 함). – TLama

+0

이 특정 응용 프로그램에서는 키보드를 통해서만 그리드에 값을 입력 할 수 있습니다. AutoHotKey 및 MS UI 자동화로 이미이 작업을 수행했지만 지금은 Delphi에서이 코드를 다시 작성해야합니다. –

+0

목표 시스템에 200 밀리 초마다 자체적으로 활성화되는 프로그램이 있기 때문에 초점을 맞추고있는 그리드에 의존 할 수 없습니다. –

답변

9

각 키를 누르는 것은 키를 누른 다음 키를 누릅니다. 따라서 키를 누를 때마다 keybd_event 번으로 두 번 전화해야합니다. 예를 들어, F3을 누릅니다 :

keybd_event(VK_F3, 0, KEYEVENTF_KEYDOWN, 0); 
keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0); 

KEYEVENTF_KEYDOWN 것을 실제로 윈도우 헤더 파일, 또는 델파이 번역에 의해 정의되어 있지 않습니다. 0으로 정의하십시오. 코드를 명시 적으로 명확하게 작성합니다.

당연히 당신은 코드를 keybd_event과 짝을 지어 쓰지 않을 것입니다. 대신에 당신은 한 쌍의 호출을 도우미 함수로 마무리 할 것입니다.

경우에 따라 두 번째 매개 변수 인 스캔 코드를 지정해야 할 수도 있습니다. 그러나 종종 필요하지 않습니다.

+0

감사합니다. 문제의 컨트롤에 초점이 맞춰져 있지 않으면'keybd_event'가 작동합니까? –

+0

@DmitriPisarenko 그렇지 않습니다. 입력 메시지는 입력 포커스가있는 컨트롤로 이동합니다. –

+0

'keybd_event' 호출을 그리드에 보내는 Windows 메시지로 대체 할 수 있습니까? 아마도 –