2011-02-22 5 views
2

SendMessage을 사용하여 다른 창으로 키보드 입력을 보내려고합니다. 단점을 알고 있지만 여러 개의 키를 보내야하므로 창을 집중해야합니다. 창에 포커스가있을 것이라고 보장 할 수는 없으므로 창에 포커스가있을 때 작동해야합니다.SendMessage를 사용하여 키를 다른 창으로 직접 보내려면 어떻게해야합니까?

메모장 창에 키를 보내서 테스트하고 있습니다. 나는 다음과 같은 변화를 시도했습니다, 그리고 아무도 일하지 않은 : 나는 질문을 썼을 때

def post_keys1(hwnd): 
    win32api.SendMessage(
     hwnd, win32con.WM_KEYDOWN, ord('A'), 
     0 + (0 << 8) + (ord('A') << 16) + (0 << 24)) 
    win32api.SendMessage(
     hwnd, win32con.WM_CHAR, ord('A'), 
     0 + (0 << 8) + (ord('A') << 16) + (0 << 24)) 
    win32api.SendMessage(
     hwnd, win32con.WM_KEYUP, ord('A'), 
     0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24)) 

def post_keys2(hwnd): 
    win32api.PostMessage(
     hwnd, win32con.WM_KEYDOWN, ord('A'), 
     0 + (0 << 8) + (ord('A') << 16) + (0 << 24)) 
    win32api.PostMessage(
     hwnd, win32con.WM_CHAR, ord('A'), 
     0 + (0 << 8) + (ord('A') << 16) + (0 << 24)) 
    win32api.PostMessage(
     hwnd, win32con.WM_KEYUP, ord('A'), 
     0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24)) 

def post_keys3(hwnd):   
    win32api.SendMessage(hwnd, win32con.WM_CHAR, 
         ord('A'), 0) 

def post_keys4(hwnd):   
    win32api.PostMessage(hwnd, win32con.WM_CHAR, 
         ord('A'), 0) 

def post_keys5(hwnd):   
    win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0) 
    win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('A'), 0) 
    win32api.PostMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0) 

def post_keys6(hwnd): 
    win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0) 
    win32api.SendMessage(hwnd, win32con.WM_CHAR, ord('A'), 0) 
    win32api.SendMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0) 

답변

5

, 나는 SendKeys는 키보드 입력을 생성하는 올바른 방법임을 이해하고, 그 모든 경우에 작동하는 단 하나입니다. 그러나 SendKeys을 사용할 수 없기 때문에 내 프로그램이 실행되는 동안 내 프로그램이 실행되는 동안 내 프로그램이 실행되는 동안 마우스 클릭이 창 포커스를 변경하고 언제든지 발생할 수 있다는 것을 의미하므로 SendKeys 보내기 시작 잘못된 창에 입력하십시오.

내가 알고 싶었던 이유는 왜 내 코드가 작동하지 않는지에 관한 것이 었습니다. 내가 보낸 메시지 유형에 문제가 있습니까? PostSend 대? WPARAM은 무엇이되어야합니까? 기타 ... 아마도 메모장 내부에있는 편집 컨트롤이 아닌 메모장 창으로 메시지를 보내려는 응답이있었습니다. 제대로 작동하는지 의심 스럽습니다.

어쨌든, 나는 그것을 실제로 작업 할 원하는 응용 프로그램에 입력을 전송했는데,이 작업 결국 :

def send_input_hax(hwnd, msg): 
    for c in msg: 
     if c == "\n": 
      win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) 
      win32api.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0) 
     else: 
      win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(c), 0) 

그래서 대답은 내가 측면에서 잘못된 아무것도하지 않은 것입니다 메시지 유형 또는 메시지의 내용에 따라 잘못된 대상에만 적용됩니다.

+0

+1하지만 다른 사람들에게 일어날 경우를 대비해 주목하십시오. 일부 앱에서는'VM_RETURN' 시뮬레이션을 위해'SendMessage' 대신'PostMessage'를 사용해야합니다. – tokland

관련 문제