2012-10-30 6 views
0

"{TAB}"키를 다른 응용 프로그램에 보내려합니다. (키를 텍스트 상자가 아닌 창으로 보냅니다). VB.NET 다른 응용 프로그램 창에 Tab 키 보내기

내가 시도 :

SendMessage(hWnd, WM_SETHOTKEY, VK_TAB, 0) 

아무 일도하지 않습니다.
내 목표는 : 내 응용 프로그램 또는 다른 응용 프로그램에
보내기 탭 키를 눌러 응용 프로그램 창은 초점 하지 때.
나는 많은 시도를하고 난 항상 같은 반환

(나는 sendkey 선택의 여지가 (이 내가 그것을 사용하고 처음입니다.)이없는이 경우 전문 아니라는 것을 알고) 결과 :

아무 일도 없었습니다.

답변을 알고 있습니까?

답변

0

다른 창을 먼저 활성화해야합니다. Change focus to another window in VB.NET을 확인하십시오. 다음 보내기 키를 사용하십시오.

+0

내가 다시 쓴 것을 읽으십시오. 창에 포커스가 없을 때 키를 보내려고합니다. – Nmmmm

+1

포커스가 없다면 보낼 수 없다고 생각합니다. 저는이 문제에 대해 50 % 확신합니다. 몇 년 전에 시도했기 때문에 창을 먼저 집중시키는 것 외에는 어떻게해야 할지를 알 수 없었기 때문입니다. 그러나, 나는 완전히 틀릴 수 있었다. – urlreader

1

몇 시간 전에 이런 종류의 문제로 고생하고 있었지만, 나는 살펴볼 몇 가지 제안을했습니다.

1은 autoit이며 vb.net에서 참조 할 수있는 dll을 포함하고 있으며 매우 간단하며 잘 설명되어 있습니다. 나는 제 3 자 프로그램을 통제 할 필요가있을 때마다 그것을 사용하는 경향이 있습니다.

다른 하나는 ui automation classes 는 예를 들어이보기입니다 :

http://blog.functionalfun.net/2009/06/introduction-to-ui-automation-with.html

7

SendKeys 당신이 활성화 될하기 위해 키를 전송하는 응용 프로그램이 필요합니다. 위의 링크에서

:

사용 SendKeys 매크로는 활성 응용 프로그램에 키 입력 및 키 입력 조합을 보낼 수 있습니다.

이 제한 사항을 해결하려면 WinApi 기능을 사용해야합니다.

,617 :

  1. FindWindowpInvoke.net
  2. FindWindowExpInvoke.net
  3. sendMessagepInvoke.net

는 여기서 예

MSDN Forum Post보기는 전기의 변형 예

Public Class Form1 
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
        (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr 
    Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ 
        (ByVal hWnd As IntPtr, ByVal hWndChildAfterA As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr 
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
        (ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr 
    Const WM_SETTEXT As Integer = &HC 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Dim destination As IntPtr = FindWindow(Nothing, "Untitled - Notepad") 
     Dim destControl As IntPtr = FindWindowEx(destination, IntPtr.Zero, "Edit", Nothing) 
     SendMessage(destControl, WM_SETTEXT, IntPtr.Zero, "Hello" & vbTab & "GoodBye" & vbCrLf) 

    End Sub 

End Class 

은 추가는 WM_KEYDOWN를 사용하여 추가 예 나는 TestForm로 설정 창 제목에 또 다른 작은 응용 프로그램을 만들고 응용 프로그램이 TabKey을 가지고 있는지 확인하기 위해의 WndProc 메소드를 오버라이드.

Public Class Form1 

    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
       (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr 
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
       (ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As IntPtr 
    Const WM_KEYDOWN As Integer = &H100 
    Const VK_TAB As Integer = &H9 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 

     Dim destination As IntPtr = FindWindow(Nothing, "TestForm") 
     SendMessage(destination, WM_KEYDOWN, VK_TAB, 0) 

    End Sub 

End Class 

시험 양식

양식

보내기

MyBase.WndProc (m)에 중단 점을 넣고 전송 된 내용을 볼 수 m 봐.

Public Class Form1 

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
     MyBase.WndProc(m) 
    End Sub 

End Class 
+0

"편집"클래스로 보내면, 메시지 (Tab 키)를 비공개 응용 프로그램의 기본 창으로 보내려고합니다. WM_SETTEXT가 아니라 WM_KEYDOWN 및 WM_KEYUP을 사용하고 있습니다. – Nmmmm

+0

@Nmmmm 당신이 달성하고자하는 것은 정확히 무엇입니까? 질문에 표시 한 예는 HotKey를 만들려고하는 것처럼 보입니다. 설명서에는 vk_Tab이 그 용도로 유효하지 않다고 나와 있습니다. 내가 준 코드는 메모장의 일부인 편집 컨트롤에 텍스트를 보냅니다. WM_keyDown이 작동하는 다른 예제를 추가하겠습니다. –

+0

ok, thanks =), 나는 그것을 검사 할 것이다. – Nmmmm