2013-11-30 5 views
0

Я пытаюсь использовать sendinput API в окне дочернего mdi во внешнем приложении, чтобы отправлять ему ключи/мышь для математических операций. У меня есть идентификатор дескриптора окна и используйте API окон setfocus для установки на него, но sendinput не отправит ключи. Я перехожу к элементам приема, которые позволяют использовать числовые значения. Кроме того, мне нужны некоторые числовые значения для отправки в виде десятичного ввода, например, 3.3. Если вам нужно изображение внешнего приложения, пожалуйста, прокомментируйте ниже, и я разместим изображение в моей учетной записи Google.Как использовать sendinput для дочернего окна mdi во внешнем приложении?

...... 
Dim hNoteThread As IntPtr = GetWindowThreadProcessId(windowids(foundid), IntPtr.Zero) 
    If hNoteThread <> 0 Then 
     MsgBox("Panel 0 found for input") 
    End If 
    ' SetForegroundWindow(windowids(foundid)) 
    If AttachThreadInput(GetCurrentThreadId(), hNoteThread, True) = True Then 
     SetFocus(windowids(foundid)) 
     System.Threading.Thread.Sleep(1000) 
     SendKey(VK_TAB) 
     System.Threading.Thread.Sleep(2000) 
     SendKey(VK_NUMPAD2) 
     System.Threading.Thread.Sleep(2000) 
     SendKey(VK_TAB) 
     SendKey(VK_NUMPAD0 + VK_DECIMAL + VK_NUMPAD5) 
     ' System.Threading.Thread.Sleep(1000) 
     SendKey(VK_TAB) 
     SendKey(VK_NUMPAD1) 
     ' System.Threading.Thread.Sleep(1000) 
     SendKey(VK_TAB) 
     SendKey(VK_NUMPAD2) 
     System.Threading.Thread.Sleep(2000) 
     MsgBox("keys sent") 
    Else 
     MsgBox("keys not sent") 
    End If 

    Private Sub SendKey(ByVal bKey As Short) 
    Dim GInput(1) As INPUT 

    ' press the key 
    GInput(0).type = INPUT_KEYBOARD 
    GInput(0).ki.wVk = bKey 
    GInput(0).ki.dwFlags = 0 

    ' release the key 
    GInput(1).type = INPUT_KEYBOARD 
    GInput(1).ki.wVk = bKey 
    GInput(1).ki.dwFlags = KEYEVENTF_KEYUP 


    SendInput(2, GInput, Marshal.SizeOf(GetType(INPUT))) 

End Sub 

Edit: вот ссылка на изображение, так кто-то может понять, как вход должен быть отправлен: https://drive.google.com/file/d/0BwIppJC0dxJBalp3Ykd2VzZkQ0E/edit?usp=sharing

целевого управления для отправки ввода являются Psi, D, и другие ценности которые могут быть изменены в Panel0, и мне также нужно нажать кнопку.

Проблема заключается в том, что отправка ввода не работает вообще, и в моем окне сообщения указано, что вход был отправлен.

+0

Примечание: windowid - это дескриптор окна mdi, который я нашел для использования окна Iam, а VK_ - коды виртуального ключа для sendinput. – starman

+0

Фокус не достаточно, окно должно быть на переднем плане. Функция SetForegroundWindow(). –

+0

Я использовал экранное окно, но оно не работает. Я прокомментировал это выше в коде. Я мог бы использовать setforegroundwindow и setfocus в обратном порядке или неправильно. Есть ли у вас какие-либо предложения? – starman

ответ

0

Я понял, что кнопка была нарисованной приложением кнопкой, поэтому у нее не было ручки! Кроме того, могут быть сделаны и другие элементы управления. Я чувствую себя таким глупым. Я закончил получать дескриптор основной формы и подчиненной формы, а затем перебирал разные элементы управления, кроме кнопки. Для кнопки: я использовал класс RECT для получения нижнего левого угла окна и продолжал перемещать x до тех пор, пока я не достиг самого левого угла кнопки при использовании sendinput для клика. Прошу прокомментировать ниже, если вы хотите источник. Его слишком большой, чтобы публиковать здесь.