C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Drag&Dropのドラッグ元


(過去ログ 141 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■82790 / inTopicNo.1)  Drag&Dropのドラッグ元
  
□投稿者/ ねこまっしぐら (1回)-(2017/02/04(Sat) 19:36:38)

分類:[VB.NET/VB2005 以降] 

外部プログラム(webブラウザ)からurlをドロップされた時にどのプログラムからドロップされたか知る方法はあるでしょうか?
(ただchromeやoperaのようにプロセス一杯立ち上げるプログラムの場合どうやってその名前でアクセスすればいいのか分かりませんが…)
引用返信 編集キー/
■82796 / inTopicNo.2)  Re[1]: Drag&Dropのドラッグ元
□投稿者/ 魔界の仮面弁士 (1112回)-(2017/02/05(Sun) 19:20:22)
No82790 (ねこまっしぐら さん) に返信
> 外部プログラム(webブラウザ)からurlをドロップされた時にどのプログラムからドロップされたか知る方法はあるでしょうか?
> (ただchromeやoperaのようにプロセス一杯立ち上げるプログラムの場合どうやってその名前でアクセスすればいいのか分かりませんが…)

自作アプリ間の話であれば、ドラッグデータの中に、
呼び出し元プロセスに関する情報を同梱しておけば済みますが、
汎用的な方法は無いと思います。
引用返信 編集キー/
■82799 / inTopicNo.3)  Re[2]: Drag&Dropのドラッグ元
□投稿者/ ねこまっしぐら (2回)-(2017/02/05(Sun) 22:50:57)
No82796 (魔界の仮面弁士 さん) に返信
> ■No82790 (ねこまっしぐら さん) に返信
>>外部プログラム(webブラウザ)からurlをドロップされた時にどのプログラムからドロップされたか知る方法はあるでしょうか?
>>(ただchromeやoperaのようにプロセス一杯立ち上げるプログラムの場合どうやってその名前でアクセスすればいいのか分かりませんが…)
>
> 自作アプリ間の話であれば、ドラッグデータの中に、
> 呼び出し元プロセスに関する情報を同梱しておけば済みますが、
> 汎用的な方法は無いと思います。

レスありがとうございます
やっぱり無理ですか…
ドロップされた時にドロップ元にAlt+PrtScrn送ってスナップショット撮ろうかと思ってたのですが…
他の方法考えます
ありがとうございました
解決済み
引用返信 編集キー/
■82816 / inTopicNo.4)  Re[3]: Drag&Dropのドラッグ元
□投稿者/ Atata!! (1回)-(2017/02/06(Mon) 22:02:47)
発想を変えて・・・

ドロップを実施するプロセスは高い確率でマウスをキャプチャします。
そこでドロップ時にマウスをキャプチャしているウィンドウを取得するという方法であれば、
高い確率でドロップ元のプロセスを取得できると思います。

他プロセスのマウスをキャプチャしているウィンドウを取得する API は GetGUIThreadInfo ですが
.NET Framework のクラスライブラリに同等の機能があるかは調べてません。
解決済み
引用返信 編集キー/
■82819 / inTopicNo.5)  Re[4]: Drag&Dropのドラッグ元
□投稿者/ 魔界の仮面弁士 (1118回)-(2017/02/07(Tue) 11:11:59)
No82816 (Atata!! さん) に返信
> そこでドロップ時にマウスをキャプチャしているウィンドウを取得するという方法であれば、
> 高い確率でドロップ元のプロセスを取得できると思います。

DragDrop の時点ではキャプチャが解除されてしまっていたので、
DragEnter の段階で検査してみました。


Imports System.IO
Imports System.Text
Imports System.Runtime.InteropServices

Public Class Form1
    Private WithEvents ListBox1 As ListBox

    Public Sub New()
        InitializeComponent()
        ListBox1 = New ListBox() With {.Name = "ListBox1"}
        Me.Padding = New Padding(4)
        ListBox1.Dock = DockStyle.Fill
        ListBox1.IntegralHeight = False
        ListBox1.AllowDrop = True
        Controls.Add(ListBox1)
    End Sub

    ''' <summary>URL のドロップのみを受け付ける</summary>
    Private Sub ListBox1_DragEnter(sender As Object, e As DragEventArgs) Handles ListBox1.DragEnter
        If AllowFormats.Any(AddressOf e.Data.GetDataPresent) Then
            e.Effect = DragDropEffects.Link

            Dim url As String = ReadUrl(e.Data)
            Dim p As Process = DragSource()
            ListBox1.Items.Clear()
            ListBox1.Items.Add(url)
            ListBox1.Items.Add(p.ProcessName)
            ListBox1.Items.Add(String.Format("ProcessId={0}", p.Id))
            p.Dispose()
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub

    Private Function ReadUrl(e As IDataObject) As String
        Dim url As String = Nothing
        Dim sr As StreamReader = Nothing
        sr = (From d In Decoder Where e.GetDataPresent(d.Key, False) Select New StreamReader(DirectCast(e.GetData(d.Key), MemoryStream), d.Value)).FirstOrDefault()
        If sr IsNot Nothing Then
            url = sr.ReadToEnd()
            sr.Dispose()
        End If
        Return url
    End Function

    Private Function DragSource() As Process
        Dim size As Integer = 24 + IntPtr.Size * 6
        Dim p As IntPtr = Marshal.AllocHGlobal(size)
        Marshal.WriteInt32(p, 0, size)
        Marshal.WriteInt32(p, 4, 0)
        GetGUIThreadInfo(IntPtr.Zero, p)
        Dim hwndCapture As IntPtr = Marshal.ReadIntPtr(p, 8 + IntPtr.Size * 2)
        Marshal.FreeHGlobal(p)
        Dim pid As Integer
        GetWindowThreadProcessId(hwndCapture, pid)
        Return Process.GetProcessById(pid)
    End Function

    Private Shared AllowFormats() As String = {"UniformResourceLocatorW", "UniformResourceLocator"}
    Private Shared Decoder As New Dictionary(Of String, Encoding) From {{"UniformResourceLocatorW", Encoding.Unicode}, {"UniformResourceLocator", Encoding.Default}}
    Private Declare Unicode Function GetGUIThreadInfo Lib "USER32" (idThread As IntPtr, ByVal lpgui As IntPtr) As Boolean
    Private Declare Unicode Function GetWindowThreadProcessId Lib "USER32" (hWnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer
End Class

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -