ドロップを許可する前に、ターゲット(ターゲットが属する.exe)を確認する方法はありますか?
私が達成しようとしているのは、コントロールをWordまたはExcelにドラッグアンドドロップできるようにし、ターゲットアプリケーションに応じて適切なファイルを渡すことです。
編集:これは私がVBで試したコードです
@Davidコードをありがとう。Buttonコントロール(WPF)を使用して同様のことを試し、データオブジェクトにファイルパスを追加しました。スタック不均衡の例外が発生しています。
コードは次のとおりです(VB.Netで試行)-これにより、このエラーが発生します。PInvoke関数'TestApplication!TestApplication.MainWindow :: GetCursorPos'を呼び出すと、スタックのバランスが崩れます。これは、マネージドPInvokeシグニチャがアンマネージドターゲットシグニチャと一致しないことが原因である可能性があります。PInvokeシグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。
私は何かを忘れましたか?
EDITはいくつかの変更を加え、現在は機能しています。
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Imports System.Collections.Specialized
Class MainWindow
<DllImport("user32.dll")> _
Private Shared Function WindowFromPoint(ByVal xPoint As Integer, ByVal yPoint As Integer) As IntPtr
End Function
<DllImport("user32.dll")> _
Private Shared Function GetCursorPos(lpPoint As Point) As Boolean
End Function
<DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function GetProcessId(hWnd As IntPtr) As Integer
End Function
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function GetWindowThreadProcessId(hWnd As IntPtr, lpdwProcessId As Integer) As UInteger
End Function
Private MouseIsDown As Boolean = Nothing
Private Sub DropButton_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles DropButton.PreviewMouseLeftButtonDown
MouseIsDown = True
End Sub
Private Sub DropButton_MouseMove(sender As Object, e As MouseEventArgs) Handles DropButton.MouseMove
If MouseIsDown Then
Dim data As New DataObject()
Dim DropList As New StringCollection
DropList.Add("c:\file.txt")
data.SetFileDropList(DropList)
DragDrop.DoDragDrop(CType(e.OriginalSource, DependencyObject), data, DragDropEffects.Move)
End If
End Sub
Private Sub DropButton_GiveFeedback(sender As Object, e As GiveFeedbackEventArgs) Handles DropButton.GiveFeedback
Dim a = Mouse.GetPosition(Me)
If a <> Nothing Then
Dim hWnd As IntPtr = WindowFromPoint(a.X, a.Y)
If hWnd <> Nothing Then
Dim processId As Integer
GetWindowThreadProcessId(hWnd, processId)
Dim proc As Process = Process.GetProcessById(processId)
label1.Content = proc.MainWindowTitle
End If
End If
End Sub
End Class