0

ページに正常にアクセスし、[ファイルのアップロード] ボタンをクリックする Web アプリがあります。

私のアプリは、ポップアップ ウィンドウを監視してフックすることで、ポップアップ ウィンドウを正常に処理することもできます。ほとんどの場合、「OK」または「キャンセル」ボタンをクリックするだけです。ボタンは簡単です。

私が助けを必要としているのは、Choose-File ダイアログです。私はそれをうまくフックしていますが、それには多くのコントロールがあり、何らかの方向性が必要です.

ファイル選択ダイアログの例

これらはその上の子コントロールです:

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

File-Nameテキストボックス/コンボボックスに正確なパス/ファイルを貼り付けて、「開く」をクリックしていただければ幸いです。ボタンの部分は簡単ですが、ウィンドウでファイルを選択する方法も、ファイル名入力フィールドにパスを入力する方法もわかりません。

今、私はこのようなものを持っています:

<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

これは問題なく動作しますが、テキスト/コンボ フィールドに入力するか、ウィンドウでファイルを選択して、開くファイルを選択するために何かを追加する必要があります。

4

1 に答える 1

1

答えは、元のリストにリストされているコントロールの 1 つである、「編集」というテキストを含むコントロールを探すことであることがわかりました。

上記のコードに従って、新しいポインタを作成しptrEdit、それにコントロール where を割り当てました"Edit".Equals(sbControl.ToString())

次に、それを操作するために、DLL の 1 つを使用しました。

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

そして、「アップロードするファイルを選択」ダイアログボックスを制御することができました。

于 2013-07-23T14:35:30.683 に答える