Results 1 to 4 of 4
  1. #1
    Join Date
    May 2007
    Posts
    37

    Unanswered: API: Drag and Drop from Explorer to a text box

    Hi There,

    The following code does the job, but some times when I try to open the form the computer freezes and I have to kill the process to get out of this situation.
    I'm using Access 2003.

    Any Idea what makes it to happen?



    Private Sub Form_Open(Cancel As Integer)
    Call sEnableDrop(Me)
    Call sHook(Me.Hwnd, "sDragDrop")
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    Call sUnhook(Me.Hwnd)
    End Sub


    Option Compare Database
    Option Explicit
    '************* Code Start *************
    ' This code was originally written by Dev Ashish.
    ' It is not to be altered or distributed,
    ' except as part of an application.
    ' You are free to use it in any application,
    ' provided the copyright notice is left unchanged.
    '
    ' Code Courtesy of
    ' Dev Ashish
    '
    Private Declare Function apiCallWindowProc Lib "user32" _
    Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As Long, _
    ByVal Hwnd As Long, _
    ByVal Msg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) _
    As Long

    Private Declare Function apiSetWindowLong Lib "user32" _
    Alias "SetWindowLongA" _
    (ByVal Hwnd As Long, _
    ByVal nIndex As Long, _
    ByVal wNewWord As Long) _
    As Long

    Private Declare Function apiGetWindowLong Lib "user32" _
    Alias "GetWindowLongA" _
    (ByVal Hwnd As Long, _
    ByVal nIndex As Long) _
    As Long

    Private Declare Sub sapiDragAcceptFiles Lib "shell32.dll" _
    Alias "DragAcceptFiles" _
    (ByVal Hwnd As Long, _
    ByVal fAccept As Long)

    Private Declare Sub sapiDragFinish Lib "shell32.dll" _
    Alias "DragFinish" _
    (ByVal hDrop As Long)

    Private Declare Function apiDragQueryFile Lib "shell32.dll" _
    Alias "DragQueryFileA" _
    (ByVal hDrop As Long, _
    ByVal iFile As Long, _
    ByVal lpszFile As String, _
    ByVal cch As Long) _
    As Long

    Private lpPrevWndProc As Long
    Private Const GWL_WNDPROC As Long = (-4)
    Private Const GWL_EXSTYLE = (-20)
    Private Const WM_DROPFILES = &H233
    Private Const WS_EX_ACCEPTFILES = &H10&
    Private hWnd_Frm As Long

    Sub sDragDrop(ByVal Hwnd As Long, _
    ByVal Msg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long)
    Dim lngRet As Long, strTmp As String, intLen As Integer
    Dim lngCount As Long, i As Long, strOut As String
    Const cMAX_SIZE = 50
    On Error Resume Next
    If Msg = WM_DROPFILES Then
    strTmp = String$(255, 0)
    lngCount = apiDragQueryFile(wParam, &HFFFFFFFF, strTmp, Len(strTmp))
    MsgBox lngCount
    For i = 0 To lngCount - 1
    strTmp = String$(cMAX_SIZE, 0)
    intLen = apiDragQueryFile(wParam, i, strTmp, cMAX_SIZE)
    strOut = strOut & Left$(strTmp, intLen) & ";"
    Next i
    strOut = Left$(strOut, Len(strOut) - 1)
    Call sapiDragFinish(wParam)
    With Forms!frmDragDrop!lstDrop
    .RowSourceType = "Value List"
    .RowSource = strOut
    Forms!frmDragDrop.Caption = "DragDrop: " & _
    .ListCount & _
    " files dropped."
    End With

    Else
    lngRet = apiCallWindowProc( _
    ByVal lpPrevWndProc, _
    ByVal Hwnd, _
    ByVal Msg, _
    ByVal wParam, _
    ByVal lParam)
    End If
    End Sub

    Sub sEnableDrop(frm As Form)
    Dim lngStyle As Long, lngRet As Long
    lngStyle = apiGetWindowLong(frm.Hwnd, GWL_EXSTYLE)
    lngStyle = lngStyle Or WS_EX_ACCEPTFILES
    lngRet = apiSetWindowLong(frm.Hwnd, GWL_EXSTYLE, lngStyle)
    Call sapiDragAcceptFiles(frm.Hwnd, True)
    hWnd_Frm = frm.Hwnd
    End Sub

    Sub sHook(Hwnd As Long, _
    strFunction As String)
    'lpPrevWndProc = apiSetWindowLong(Hwnd, GWL_WNDPROC, AddrOf(strFunction))
    Select Case strFunction
    Case "sDragDrop"
    lpPrevWndProc = apiSetWindowLong(Hwnd, GWL_WNDPROC, AddressOf sDragDrop)
    Case Else
    Debug.Assert False 'Need to setup this function as another Case.
    End Select
    End Sub

    Sub sUnhook(Hwnd As Long)
    Dim lngTmp As Long
    lngTmp = apiSetWindowLong(Hwnd, _
    GWL_WNDPROC, _
    lpPrevWndProc)
    lpPrevWndProc = 0
    End Sub
    '**************** Code End ***************

  2. #2
    Join Date
    Jun 2005
    Location
    Richmond, Virginia USA
    Posts
    2,763
    Provided Answers: 19
    When code in the Form_Open event causes problems/doesn't work, the first thing I suggest is to move the code to the Form_Load event. Form_Open is frequently too early in the scheme of things to work properly/reliably.

    Linq ;0)>
    Hope this helps!

    The problem with making anything foolproof...is that fools are so darn ingenious!

    All posts/responses based on Access 2003/2007

  3. #3
    Join Date
    May 2007
    Posts
    37
    Thanks for the reply.

    I've tried it and first it still did the same thing
    but I've tried few times more afterward and it didn't freeze.
    Maybe the problem was solved.

    Thank you very much

  4. #4
    Join Date
    Jun 2005
    Location
    Richmond, Virginia USA
    Posts
    2,763
    Provided Answers: 19
    Post back on this thread if the problem arises again.

    Linq ;0)>
    Hope this helps!

    The problem with making anything foolproof...is that fools are so darn ingenious!

    All posts/responses based on Access 2003/2007

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •