2014-07-12 2 views
0

keybd_event를 사용하여 C#의 키 이벤트를 시뮬레이트하고 있습니다. 이 예에서는 Windows + D Kombination을 바탕 화면으로 보내려고합니다. 다음 코드는 버튼 클릭 기능에 포함되어keybd_event가 thread.sleep 이후에 전송됩니다.

Robot.PressKey(Keys.LWin); 
Robot.PressKey(Keys.D); 
Thread.Sleep(50); 
Robot.ReleaseKey(Keys.D); 
Robot.ReleaseKey(Keys.LWin); 
Thread.Sleep(1000); 

public void PressKey(Keys key) 
{ 

    keybd_event((byte)key, 0, 1, 0); 
} 

public void ReleaseKey(Keys key) 
{ 
    keybd_event((byte)key, 0, 1|2, 0); 
} 

[DllImport("user32.dll", SetLastError = true)] 
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 

내가 무엇을 기대 : 내가 바탕 화면으로 돌아가 1 초 동안 기다립니다. 결과 : 1 초 후에 바탕 화면으로 돌아갑니다.

Thread.Sleep (1000) 이후에 더 많은 함수 호출이 계속되면 데스크톱으로 절대 반환되지 않습니다. 내가 뭘 잘못하고 있니? Thx;)

EDIT : 동일한 문제가있는 SendInput (복사 붙여 넣기 복사 : http://damiproductions.darkbb.com/t504-c-sending-keys-with-the-sendinput-api)으로 시도해 보았습니다. 나는 또한 Thread.Sleep()을 Stopwatch와 Loop로 대체했다. 내 마지막 시도가 새로운 스레드에서 시작되었습니다. 이것은 에테르를 돕지 못했습니다.

+0

이벤트에서 절전 모드를 해제하십시오(). –

+0

데스크톱으로 돌아간 후 1 초 동안 기다리는 더 좋은 방법이 있습니까? 루프가있는 스톱워치를 시도했지만 아무 것도 바뀌지 않았습니다 – Genae

+0

아니요, 오랫동안 반복하지 마십시오. 이제 당신은 적절한 질문을 알아, 구글. 수백 번 여기에 물었다. –

답변

1

문제는 당신이 전체 과정을 자고 있다는 것입니다. 당신이있는 곳

private async void _stuff() 
{ 
Robot.PressKey(Keys.LWin); 
Robot.PressKey(Keys.D); 
await Task.Delay(50); 
Robot.ReleaseKey(Keys.D); 
Robot.ReleaseKey(Keys.LWin); 
await Task.Delay(1000); 
} 

하고 부품 : 당신은 그냥 작업을 지연 할 경우 , 당신의 물건에 비동기있는 Methos를 사용

_stuff(); 
님의

Robot.PressKey(Keys.LWin); 
Robot.PressKey(Keys.D); 
await Task.Delay(50); 
Robot.ReleaseKey(Keys.D); 
Robot.ReleaseKey(Keys.LWin); 
await Task.Delay(1000); 

변경을

.Sleep과의 차이점은 기다리는 동안 응용 프로그램이 더 많은 작업을 수행 할 수 있으며 프로그램을 고정하지 않는 것입니다. D

+0

대단히 감사합니다! 이것은 다른 문제로 이어지지 만, 나는 그들을 처리 할 수있을 것이라고 생각한다;) – Genae