2013-06-27 130 views
0

我有一個成功進入頁面的網頁應用程序,並單擊「上傳文件」按鈕。Windows Hwnd句柄選擇文件

我的應用程序還通過監控並掛鉤彈出窗口來成功處理彈出窗口。大部分情況下,只需點擊「確定」或「取消」按鈕即可。按鈕很容易。

我需要幫助的是選擇文件對話框。我很好,但有很多控制,我需要一些方向。

Choose File Dialog Example

這些都是它的子控件:

DUIViewWndClassName,DirectUIHWND,CtrlNotifySink,NamespaceTreeControl,Static,SysTreeView32,CtrlNotifySink,Shell Preview Extension Host,CtrlNotifySink,SHELLDLL_DefView,DirectUIHWND,CtrlNotifySink,ScrollBar,CtrlNotifySink,ScrollBar,Static,Static,Static,ListBox,Static,Static,ComboBoxEx32,ComboBox,Edit,Static,ComboBox,Button,Button,Button,ScrollBar,WorkerW,ReBarWindow32,TravelBand,ToolbarWindow32,Address Band Root,msctls_progress32,Breadcrumb Parent,ToolbarWindow32,ToolbarWindow32,UniversalSearchBand,Search Box,SearchEditBoxWrapperClass,DirectUIHWND 

我將很高興與堅持的準確路徑/文件到文件名的文本框/組合框,然後點擊「打開」。按鈕部分很簡單,但我不知道如何在窗口中選擇文件,和/或如何將我的路徑放入文件名輸入字段。

現在,我有這樣的事情:

<DllImport("user32.dll")> _ 
Private Shared Function GetClassName(ByVal hWnd As IntPtr, ByVal lpClassName As StringBuilder, ByVal nMaxCount As Int32) As Int32 
End Function 

<DllImport("user32.dll")> _ 
Private Shared Function GetWindowText(ByVal hWnd As IntPtr, ByVal text As StringBuilder, ByVal maxLength As Int32) As Int32 
End Function 

<DllImport("user32.dll")> _ 
Private Shared Function GetDlgCtrlID(ByVal hwndCtl As IntPtr) As Integer 
End Function 

.... 

Private Shared Function hwndHandler() As Int32 
    Dim ptrButtonhwnd As IntPtr 

    For Each pChild As IntPtr In Interop.ChildWindows(pPopup.hwnd) 
     Dim sbControl As New StringBuilder(255) 
     GetClassName(pChild, sbControl, sbControl.Capacity) 
     If "Button".Equals(sbControl.ToString()) Then 
      Dim sbText As New StringBuilder(255) 
      GetWindowText(pChildOfDialog, sbText, sbText.Capacity) 
      If "&Open".Equals(sbText.ToString()) Then 
       ptrButtonHwnd = pChild 
      End If 
     End If 
    Next 

    If ptrButtonHwnd <> IntPtr.Zero Then 
     Dim ctrlId As Int32 = GetDlgCtrlID(ptrButtonHwnd) 
     SendMessage(pPopup.hwnd, WM_COMMAND, New IntPtr(ctrlId), ptrButtonHwnd) 
     Return 1 
    End If 

Return 0 
End Function 

這工作得很好,但我需要補充的東西,選擇一個文件或者通過輸入到文本/組合場,或選擇它來打開在窗口中。

回答

1

我發現答案是尋找與「編輯」,這是我的原始列表中列出的控件之一的文本控件。

所以根據我上面貼的代碼,我做了一個新的指針ptrEdit,並將它分配給了控件"Edit".Equals(sbControl.ToString())

然後操縱它,我用dll的一個:

If ptrEdit <> IntPtr.Zero Then 
    SetWindowText(pEditHwnd, strFilePath) 
    If ptrButtonHwnd <> IntPtr.Zero Then 
     Dim ctrlId As Int32 = GetDlgCtrlID(ptrButtonHwnd) 
     SendMessage(cwp.hwnd, WM_COMMAND, New IntPtr(ctrlId), ptrButtonHwnd) 
     Return 1 
    End If 
End If 

所以我能夠控制的「選擇要上傳的文件」對話框。

+0

+1。感謝您與社區分享您的解決方案。 – Neolisk