2014-02-27 1 views
2

에서 SendKeys를 식별 .방지 KeyDown 이벤트 내가 textentry을 시뮬레이션하는 프로그램을 만들고 싶어

if (e.KeyData == Keys.D1){ 
    SendKeys.Send("simulate this text entry"); 
} 
if (e.KeyData == Keys.F12){ 
    SendKeys.Send("123"); 
} 

그러나 문제는 내가 F12 버튼을 누르면 KeyDown 이벤트를 식별 첫 번째 "1" "D1"키로 보냅니다 "123"과 "시뮬레이션이 텍스트 입력"

모두 이 문제를 어떻게 방지 할 수 있습니까?

+0

주셔서 감사합니다. e.KeyData는 사용자가 D1 키를 눌렀는지 여부를 식별합니다 (D1 만, D1 키 또는 Shift 또는 ctrl 또는 alt와 같은 다른 키가 아님). 그리고 내 사건의 구조는 무엇을 의미합니까? 나는 그것을 얻지 못한다. – Astro

+0

자신에게 키 스트로크를 보낼 때 아무런 의미가 없다. 원하는 컨트롤 인 모든 컨트롤의 Text 속성을 간단히 업데이트 할 수있다. –

답변

1

마지막으로 문제를 해결 .. :) 다음 코드에서이 작업에 "SendKeys.Flush()"를 사용해야합니다 ..입니다 ...

private bool IgnoreKeys = false; 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if ((e.KeyData == Keys.D1) && (!IgnoreKeys)) 
     { 

      SendKeys.Send("Simulate this text" + "{ENTER}"); 

     } 
     if (e.KeyData == Keys.F12) 
     { 
      IgnoreKeys = true; 

      SendKeys.Send("123"); 
      SendKeys.Flush(); 

      IgnoreKeys = false; 
     } 

이 고려 KeyDown 이벤트를 방지 "1" 키 "D1"로 텍스트 "123"에

아이디어 Idle_Mind의 : 내가 동시에 그 키를 눌러 해달라고 .. Okuma.Scott 번호 @

1

키를 보내려면 전송할 문자를 무시하도록 플래그를 설정해야합니다. 또한 플래그를 다시 켜는시기를 알아야합니다. 전송할 값의 길이로 변수를 설정 한 다음 각 감지 된 키로 카운터를 증가시켜이를 수행 할 수 있습니다. 사용자가 키를 빠르게 연속으로 누르거나 키를 누르고 있으면 키 누르기가 사용자 상호 작용의 결과인지 또는 시뮬레이션에서 발생했는지 알 수 없기 때문에 이는 절대 안전하지 않습니다.

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private bool IgnoreKeys = false; 
    private int target = 0; 
    private int counter = 0; 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (!IgnoreKeys) 
     { 
      if (e.KeyData == Keys.D1) 
      { 
       Send("simulate this text entry"); 
      } 
      if (e.KeyData == Keys.F12) 
      { 
       Send("123"); 
      } 
     } 
     else 
     { 
      counter++; 
      if (counter == target) 
      { 
       IgnoreKeys = false; 
      } 
     } 
    } 

    private void Send(string entry) 
    { 
     IgnoreKeys = true; 
     counter = 0; 
     target = entry.Length; 
     SendKeys.Send(entry); 
    } 

} 
1

문제는 SendKeys.Send(...)를 사용하는 프로그램이 전송 키와 사용자의 키보드 입력의 차이를 알 수있는 방법이 없다는 것입니다 :

여기에 기본적인 생각입니다.

"123"키를 보내면 사용자가 1, 2 및 3 키를 누른 것과 같습니다. 1 키를 듣기 때문에 해당 이벤트가 발생하고 send 키가 보낸 '1'을 포착합니다.

가능하면 "텍스트를 시뮬레이트"하려는 콘텐츠에 텍스트를 추가하고 sendkeys를 피하십시오. 그렇지 않으면 이와 같은 전화 번호 단축키 ALT/Ctrl 키 조합을 고려하십시오 (Ctrl 키를 누르면되지 않기 때문에) 당신이 F12를 누르면 발사되는이 이벤트를 예방하고 "123"을 보내드립니다

 if (e.Control && e.KeyCode == Keys.D1) 
     { 
      SendKeys.Send("simulate this text entry"); 
      e.Handled = true;   
     } 

.

+0

죄송합니다 :(텍스트를 추가 할 방법이 없습니다. 게임 채팅에 텍스트 항목을 보내려합니다. 게임에서 복사 붙여 넣기 명령을 지원하지 않습니다. SendKeys가 유일한 방법입니다. 메시지를 보내려면 키가 하나만 있어야합니다 쉽게 전쟁을하는 동안. @ Idle_Mind의 대답은 내가 아래의 문제를 해결하는 데 도움이 될 수 있다고 생각합니다. .. 아직도 생각 .. :) 당신의 응답에 감사드립니다. – Astro

관련 문제