2009-02-27 5 views
2

나는 Windows 시스템 프로그래밍 : 현재 활성화되어 있지 않은 열린 응용 프로그램으로 키 입력을 보낼 수 있습니까?

이 가능한 프로그램이 다른 응용 프로그램에 키 입력을 (내가 SendMessage() API 호출에 의해 추측하고있어)를 전송하기가 ... 내 Windows 시스템 프로그래밍에 약간 녹슨 해요 (개방) 대상의 경우 응용 프로그램에 현재 포커스가 있습니까? 가능한 경우 대상 응용 프로그램을 활성 응용 프로그램으로 만들지 않습니까? 아니면 여전히 응용 프로그램을 백그라운드로 유지합니까?

미리 알려 주셔서 감사합니다.

답변

0

남아 : 예, 아니오

당신은 WM_KEYDOWN을 찾고 있습니다 :

PostMessage(hwndOther, WM_KEYDOWN, VK_ENTER, 0); 
+0

옳다고 생각하지 마십시오. 타겟 윈도우도 WM_KEYDOWN을 기다리고있을 것입니다. – MarkJ

+0

당신은이 Simon을 삭제해야합니다, 틀렸어 – MarkJ

+0

PostMessage()가 작동하고 방금 시도했습니다. MarkJ, "대상 창에서도 WM_KEYDOWN을 기대할 것입니다"라는 것이 확실하지 않은가요? PostMessage의 두 번째 매개 변수에 바로 포함되어 있습니다. –

1

아니요, 후속 호출이 setfocus를 수행하지 않는 한 포커스를 변경하지 않습니다. 메모리에서 같은 창 순서

0

예 당신은 키 입력을 보낼 수있는, 아니 그것은 다른 창을 가져 오지 않습니다 정상에.

+0

링크를 제공해 주셔서 감사합니다. 나는 VB/VBA에서 SendKeys()에 익숙하다. 문제는 단지 활성 앱으로 키를 전송하기 때문에 내 버전을 롤업해야한다는 것입니다. .NET 링크는 재미있어 보이며 더 자세히 살펴볼 것입니다. –

+0

첫 번째 링크는 기본 VB SendKeys를 사용하지 않으며 API 호출 SendInput을 사용하여 대체하므로 해당 제한이 없습니다. – MarkJ

+0

아아, 사용하는 SendInput() API 호출에는 "포 그라운드 응용 프로그램으로 전송"되는 키 입력과 동일한 제한이 있으므로 * 제한 사항이 있습니다. - SendInput()에 대한 msdn 정보를 확인하여 위의 제안대로 PostMessage()를 조사하려고합니다 ... –

0

키 입력의 지시 보내기의 경우 SendInput이 Vista/2008/W7의 UIPI (무결성 수준) 검사를 받지만 고유 한 방법입니다. 당신은 일리노이가있는 앱에 키 스트로크를 보낼 수 없습니다.

입력을 캡처하고 리디렉션하는보다 일반적인 솔루션은 전역 키보드 후크입니다 (SetWindowsHookEx 도움말 참조). 하지만 이것은 꽤 털이 많은 것들입니다. 여러분은 여러분이 키 스트로크를 보내는 방법에 대처해야합니다. 코드가 입력 스트림에 효과적으로 삽입되고 네이티브 DLL을 작성해야하기 때문에 시스템의 모든 프로세스에 영향을 미칩니다. 네가하는 일을 정확하게.

우리는 시스템에서 글로벌 키보드 후크를 사용했지만 (필자가 작성했습니다), 우리는 특별한 경우 인 단일 기능의 긴급 통화 처리 시스템입니다. 필자는 범용 Windows 컴퓨팅의 솔루션으로 전 세계적인 후크를 권장하지 않습니다.

+0

Vista UIPI에 대한 답변과 감사의 인사를 전합니다. 이후에 발견 한 것처럼 SendInput()은 전경 어플리케이션으로 전송합니다. 결국, PostMessage()는 필자의 간단한 요구에 부응했습니다. 참고 : UIPI는 PostMessage()에도 적용됩니다. –

0

당신은 PostMessage를 가진 대답은 잘못 SendInput을() 또는 후크

필요하지 않습니다.

스레드를 원격으로 첨부해야합니다. 그것은 매우 고전적인 질문이 나를 위해 작동하지만 윈도우 XP에서 (C 코드, 바로 MS 방법)

+1

깨진 링크 및 이해하기 어려운 비트! 그는 키 입력을 보내는 방법을 묻습니다. 때로 사람들은 전경이 아닌 창을 앞으로 가져 오기 위해 실을 붙이지 만 그가 묻는 것이 아닙니다. – MarkJ

+0

그는 AttachThreadInput()을 참조했을 수 있습니까? 그것은 완전히 다릅니다. –

1
PostMessage(hwndOther, WM_KEYDOWN, VK_ENTER, 0); 

어디 Win32 api Group에 참조하십시오.

하지만 Vista 및 Windows 7에서도 문제가 발생했습니다. 적절하게 UIPI와 함께. 이 프로세스에 주입 된 DLL에서 처리 할 메시지를 보내려고합니다.

문제를 해결하는 방법은 무엇입니까?

+0

이것이 Windows 8에서 더 이상 작동하지 않는지 확인할 수 있습니다. WM_KEY * 또는 WM_CHAR이 실제로 메시지를 보냈는지 확인하거나 포커스가있는 메모장에서 EDIT 컨트롤 만 확인해야합니다. –