Ответ 1
Как и вы и я, у нас есть имена, аналогично, окна имеют handles(hWnd)
, Class
и т.д. Как только вы знаете, что это за hWnd
, с ним легче взаимодействовать.
Это скриншот InputBox
Логика
-
Найдите ручку InputBox с помощью
FindWindow
и заголовок окна ввода, которыйCreate Network IDs
-
После того, как это найдено, найдите дескриптор окна редактирования в этом окне, используя
FindWindowEx
-
Как только дескриптор окна редактирования найден, просто используйте
SendMessage
для его записи.
В приведенном ниже примере мы будем писать It is possible to Interact with InputBox from VB.Net
в поле ввода Excel.
Код
Создайте форму и добавьте к ней кнопку.
Вставьте этот код
Imports System.Runtime.InteropServices
Imports System.Text
Public Class Form1
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Integer
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As String) As Integer
Const WM_SETTEXT = &HC
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Ret As Integer, ChildRet As Integer
'~~> String we want to write to Input Box
Dim sMsg As String = "It is possible to Interact with InputBox from VB.Net"
'~~> Get the handle of the "Input Box" Window
Ret = FindWindow(vbNullString, "Create Network IDs")
If Ret <> 0 Then
'MessageBox.Show("Input Box Window Found")
'~~> Get the handle of the Text Area "Window"
ChildRet = FindWindowEx(Ret, 0, "EDTBX", vbNullString)
'~~> Check if we found it or not
If ChildRet <> 0 Then
'MessageBox.Show("Text Area Window Found")
SendMess(sMsg, ChildRet)
End If
End If
End Sub
Sub SendMess(ByVal Message As String, ByVal hwnd As Long)
Call SendMessage(hwnd, WM_SETTEXT, False, Message)
End Sub
End Class
ScreenShot
Когда вы запускаете код, это то, что вы получаете
РЕДАКТИРОВАТЬ (на основе дальнейшего запроса автоматизации OK/Отмена в чате)
АВТОМАТИЧЕСКИЕ КНОПКИ OK/CANCEL INPUTBOX
Хорошо, интересный факт.
Вы можете вызвать функцию InputBox
двумя способами в Excel
Sub Sample1()
Dim Ret
Ret = Application.InputBox("Called Via Application.InputBox", "Sample Title")
End Sub
и
Sub Sample2()
Dim Ret
Ret = InputBox("Called Via InputBox", "Sample Title")
End Sub
В вашем случае используется первый способ и, к сожалению, кнопки OK
и CANCEL
не имеют дескриптора, к сожалению, вам придется использовать SendKeys (Ouch!!!)
для взаимодействия с ним. Если бы вы создали Inbutbox по второму методу, мы могли бы легко автоматизировать кнопки OK
и CANCEL
:)
Дополнительная информация:
Протестировано в Visual Studio 2010 Ultimate (64 бит)/Excel 2010 (32 бит)
Вдохновленный вашим вопросом, я на самом деле написал блог Статья о том, как взаимодействовать с кнопкой OK
на InputBox.