首页 > 解决方案 > 将文本发送到另一个应用程序

问题描述

我希望使用 SendMessage 方法将一些文本字段从 Excel 发送到另一个应用程序。下面是我的代码:

Public Declare PtrSafe Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
     ByVal hwnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByRef lParam As Any) As Long
     
Public Declare PtrSafe Function SendMessageByString Lib "user32.dll" Alias "SendMessageA" ( _
     ByVal hwnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByRef lParam As String) As Long
           
Public Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long
     
Public Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
     ByVal hWnd1 As Long, _
     ByVal hWnd2 As Long, _
     ByVal lpsz1 As String, _
     ByVal lpsz2 As String) As Long

Public Const WM_SETTEXT As Long = &HC
Public Const BM_CLICK As Long = &HF5&


    Sub RunApplication()
Dim Vendor As String
Dim qty As String
Dim PartId As String


hwnd = FindWindow(vbNullString, "Purchase Order Entry - Infor ERP VISUAL Enterprise - LIVE")
gupta_form = FindWindowEx(hwnd, 0, "Gupta:Form", vbNullString)
Order_Date = FindWindowEx(gupta_form, 0, "Edit", vbNullString)
Our_OrderID = FindWindowEx(gupta_form, Order_Date, "Edit", vbNullString)
VendorID = FindWindowEx(gupta_form, Our_OrderID, "Edit", vbNullString)
gupta_dialog = FindWindowEx(hwnd, 0, "Gupta:Dialog", "Table Toolbar")
gupta_child_table = FindWindowEx(gupta_form, 0, "Gupta:ChildTable", vbNullString)
list_clip = FindWindowEx(gupta_child_table, 0, "Gupta:ChildTable:ListClip", vbNullString)
Open_line = FindWindowEx(gupta_dialog, 0, "Button", vbNullString)
qty_edit = FindWindowEx(list_clip, 0, "Edit", vbNullString)

Vendor = Sheets("Daily Stock").Range("H16")
qty = Sheets("Daily Stock").Range("I16")
PartId = Sheets("Daily Stock").Range("A16")


Call SendMessageByString(VendorID, WM_SETTEXT, ByVal CLng(0), ByVal Vendor) 'Enter Vendor ID into Field
Call SendMessageByString(Open_line, BM_CLICK, 0, ByVal 0&) 'Click Button to open Quantity field
Timeout (2) 'Wait until Quantity field is open
Call SendMessageByString(qty_edit, WM_SETTEXT, ByVal CLng(0), ByVal qty) 'Enter Quantity from Daily Stock sheet



End Sub

我有2个问题。由于某种原因,“供应商”字符串被正确发送到外部应用程序,但是“qty_edit”窗口没有接收数据。运行该程序时,我可以看到光标已移动到正确的窗口,但没有发送数据。应用程序中这两个字段之间的唯一区别是“VendorID”窗口需要文本,而“qty_edit”窗口需要一个数字。这就是没有收到号码的原因吗?

我的第二个问题与我要写入的下一个窗口有关。为了在下一个窗口“PartID”中输入文本,我需要发送一个 Tab 击键以从“qty_edit”窗口移动到“PartID”窗口。移动到这个窗口的最佳方式是什么?我在 Spy++ 中看不到这个窗口的位置。它需要通过 Tab 击键来激活。

标签: excelvbawinapi

解决方案


我认为你让它变得比必要的复杂得多。这应该有效(或类似的东西)

AppActivate ("Purchase Order Entry - Infor ERP VISUAL Enterprise - LIVE")
SendKeys Vendor & "{TAB}" & qty
AppActivate (Application.Caption)

推荐阅读