2011-11-18 2 views
2

하루에 100 번 처리하는 프로세스를 자동화하기 위해 다른 응용 프로그램을 제어하려고했습니다. 그것은 충분히 간단합니다. 몇 번의 키 스트로크가 있지만 모든 시도에서 좌절되었습니다.sendkeys 나 window의 API로 다른 응용 프로그램을 제어 할 수 없습니다.

ROUND 1 : 내가 보내 닷넷에서 SendKeys를 시도 알트 + C : 에서는 AppActivate ("멀티 채널 주문 관리자") '내가 그때

을 제어하려는 내 응용 프로그램에 포커스를 얻을 : SendKeys.SendWait를 (SendKeys.Send ('% C') 또는 SendKeys.Send ('% C') 또는 SendKeys.Send ('% c') 또는 SendKeys.Send ('% c')는 모두 내 앱에서 아무런 일도 일어나지 않았습니다. alt를 보낸 다음 'c'를 누르면 앱이 응답하지만 콤보에는 응답하지 않습니다. 앱을 별도로 보내면 앱이 내가 필요한 것을 수행하지 않고 함께 있어야합니다. 모든 alt 키 조합은 실패하지만 단일 키 스트로크는 작동합니다.

ROUND 2 : 이 나는를 FindWindow 및 PostMessage를 API를 사용하여 키 입력을 전송 시도 :

Dim ParenthWnd As New IntPtr(0) 
    Dim hWnd As New IntPtr(0) 
    Dim iRetval As Integer 

    ParenthWnd = FindWindowByClass("momwin9c000000", 0) 
    If ParenthWnd.Equals(IntPtr.Zero) Then 
     Beep() 
    Else 

     iRetval = SendMessage(ParenthWnd, WM_KEYDOWN, Keys.Alt, 0) 
     iRetval = SendMessage(ParenthWnd, WM_KEYUP, Keys.C, 0) 
     iRetval = PostMessage(ParenthWnd, WM_KEYUP, Keys.Alt, 0) 

    End If 

이 너무 내가 응용 프로그램의 올바른 자식 창에 쓰는 아니에요 어쩌면 때문에, 실패? 나는 Spy ++를 사용하여 이것을 알아 내려고 노력했지만, 내가 뭘 잘못하고 있는지 알지 못한다.

ROUND 3 : 사용하여 스파이 ++ 나는 어쩌면 내가 완전히 내가 일을해야 이해하지 않는, 다시 전송되어야하지만 명령이 무엇인지 알아 내기 위해 노력했다.

Dim ParenthWnd As New IntPtr(0) 
    Dim hWnd As New IntPtr(0) 
    Dim iRetval As Integer 

    ParenthWnd = FindWindowByClass("momwin9c000000", 0) 
    If ParenthWnd.Equals(IntPtr.Zero) Then 
     Beep() 
    Else 
     ' Have the window handle 
     Dim ChildhWnd As New IntPtr(0) 
     ChildhWnd = FindWindowEx(ParenthWnd, IntPtr.Zero, "momwin9c000000", "MOM Main Menu Toolbar") 
     If ChildhWnd.Equals(IntPtr.Zero) = False Then 
      iRetval = PostMessage(ParenthWnd, WM_KEYUP, &H12, &HD0380001) 
      iRetval = PostMessage(ChildhWnd, WM_KEYUP, Keys.ShiftKey, 0) 
      iRetval = PostMessage(ChildhWnd, WM_KEYUP, Keys.Alt, 0) 
     End If 
    End If 

ROUND 4 : 나는 언급하지 않았다 일에 는 응용 프로그램 창은 두 패널로 나누어 져 있습니다. 한 패널에서 다른 패널로 이동할 수는 없지만 (키보드를 사용하여) alt + c를 수행 할 수 있습니다. 따라서 라운드 4는 마우스 클릭 방식으로 진행되었습니다. 포커스를 이동하려고하는 텍스트 상자의 위치를 ​​알기 위해 마우스 위치를 이동하고 클릭했습니다.

Cursor.Position = Me.PointToScreen(New Point(200, 180)) 
    mouse_event(MOUSEEVENTF_LEFTDOWN, 200, 180, 0, 0) 

바닥 패널과 클릭의 텍스트 상자의 중앙에 마우스 포인터를 이동하지만, 초점은 상단 패널에 남아 만 거의 tabkey 스트로크처럼, 다음 텍스트 상자로 이동합니다.

요약 : 실제 alt + c 키 입력과 sendkeys 버전 또는 Window API 버전간에 차이점이 무엇인지는 모르겠지만 실제 키 입력이 작동하고 시도가 실패합니다. 실제 마우스 클릭과 내 mouse_event API 시도의 차이와 동일합니다. 내가 무엇을 할 수 있는지 또는 다른 것을 시도 할 수 있는지. 모든 제안을 부탁드립니다. 나는 메인 애플 리케이션의 하위 창에 핸들을 얻을 수 있다면 내 문제의 일부가 해결 될 수 있다고 생각하지만 솔기를 할 수없고 내가 뭘 잘못하고 있는지 잘 모르겠다.

테스트로서 무료 마우스/키 스트로크 매크로 레코더를 다운로드했습니다. 창을 더 잘 제어하지 못했습니다.

답변

0

2,3 - 응용 프로그램은 키보드 상태를 확인하여 이벤트 대기열이 아닌 눌러 졌는지 확인합니다. 그래서 SendMessage이 작동하지 않습니다. keybd_event은 더 이상 사용되지 않지만 (대신 SendKeys/SendInput을 사용해야합니다.)

1 - 구성을 놓치지 않았습니까 (Is there any difference between keybd_event() and SendKeys.SendWait()?). 또한 FindWindow()/SetForegroundWindow()가 AppActivate보다 더 잘 작동 할 수 있습니까?