Results 1 to 2 of 2
  1. #1
    ybg1 is offline Novice
    Windows XP Access 2003
    Join Date
    Nov 2010
    Posts
    23

    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
    alansidman's Avatar
    alansidman is offline VIP
    Windows 7 32bit Access 2007
    Join Date
    Apr 2010
    Location
    Steamboat Springs
    Posts
    2,529

Please reply to this thread with any new information or opinions.

Similar Threads

  1. Replies: 9
    Last Post: 05-30-2011, 12:08 PM
  2. Drag and Drop into Textbox
    By jagvent in forum Forms
    Replies: 1
    Last Post: 12-20-2010, 09:31 AM
  3. Drag n Drop BETWEEN textbox and web browser
    By kirklandwater123 in forum Programming
    Replies: 4
    Last Post: 10-29-2010, 01:23 AM
  4. Drag and Drop Between Textboxes. Please Help!
    By kcpope in forum Programming
    Replies: 2
    Last Post: 10-19-2010, 05:03 PM
  5. Drag N Drop example between 2 listboxes
    By pkstormy in forum Code Repository
    Replies: 0
    Last Post: 08-30-2010, 10:10 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Other Forums: Microsoft Office Forums