Как программно эмулировать Drag&drop файла на окно стороннего приложения - C#

Узнай цену своей работы

Формулировка задачи:

ну собственно вопрос в названии к окну никакого отношения не имею и оно не на net, просто найдено среди процессов я думаю это какой нибудь PostMessage, но что туда передавать? нашел что-то про WM_DROPFILES, но везде пишут про прием файла переданного обычным образом не знаю даже за что зацепиться чтоб яндексить дальше
хочу сделать свою продвинутую автозагрзку внешних субтитров для видео проигрывателя, ничего кроме этого не придумал. обычные средства не загружают из отдельных папок с левыми названиями типа группы переводчиков и т.д

Решение задачи: «Как программно эмулировать Drag&drop файла на окно стороннего приложения»

textual
Листинг программы
        const uint WM_DROPFILES = 0x233;
 
        [DllImport( "user32.dll", SetLastError = true, CharSet = CharSet.Unicode )]
        static extern int PostMessage (
            [In] IntPtr hWnd,
            [In] uint Msg,
            [In] IntPtr wParam,
            [In] IntPtr lParam
            );
 
        const uint GHND = 0x42;
 
        [DllImport( "kernel32.dll", SetLastError = true )]
        static extern IntPtr GlobalAlloc (
            [In] uint uFlags,
            [In] int dwBytes // for x86
            // [In] long dwBytes // for x64
            );
 
        [DllImport( "kernel32.dll", SetLastError = true )]
        static extern IntPtr GlobalFree (
            [In] IntPtr hMem
            );
 
        [DllImport( "kernel32.dll", SetLastError = true )]
        static extern IntPtr GlobalLock (
            [In] IntPtr hMem
            );
 
        [DllImport( "kernel32.dll", SetLastError = true )]
        [return: MarshalAs( UnmanagedType.Bool )]
        static extern bool GlobalUnlock (
            [In] IntPtr hMem
            );
 
        [DllImport( "kernel32.dll", SetLastError = true )]
        static extern int GlobalSize (
            [In] IntPtr hMem
            );
 
        [DllImport( "Shell32.dll", SetLastError = true, CharSet = CharSet.Unicode )]
        unsafe static extern int DragQueryFile (
            [In] IntPtr hDrop,
            [In] int iFile,
            [Out] StringBuilder lpszFile,
            [In] int cch
            );
 
        [DllImport( "ntdll.dll", CallingConvention = CallingConvention.Cdecl )]
        unsafe static extern void* memcpy (
            [In] void* destination,
            [In] void* source,
            [In] int num // for x86
            // [In] long num // for x64
            );
 
        [StructLayout( LayoutKind.Sequential, Pack = 4 /* x86 */ )]
        struct DROPFILES
        {
            public int pFiles;
            public long pt;
            public int fNC;
            public int fWide;
        }
 
        unsafe IntPtr GetDropFilesPtr ( string[] files )
        {
            int memAllocSize = 0; // in bytes
            var dropFiles    = new DROPFILES();
            var pMem         = IntPtr.Zero;
            var pLockedMem   = IntPtr.Zero;
            var ptr          = (byte*)0;
 
            dropFiles.fWide = 1;
            dropFiles.pFiles = Marshal.SizeOf( dropFiles );
 
            for ( int i = 0; i < files.Length; ++i )
                memAllocSize += (files[i].Length * 2) + 2 /* \0\0 */;
            memAllocSize += 2; // \0\0
            memAllocSize += dropFiles.pFiles;
 
            pMem = GlobalAlloc( GHND, memAllocSize );
            pLockedMem = GlobalLock( pMem );
            {
                // copy files names to unmanaged mem
                *(DROPFILES*)(void*)pLockedMem = dropFiles;
                ptr = (byte*)pLockedMem + dropFiles.pFiles;
 
                for ( int i = 0; i < files.Length; ++i )
                {
                    int count = files[i].Length * 2;
                    fixed ( char* pBuff = files[i] )
                        memcpy( ptr, pBuff, count );
                    ptr += count + 2;
                }
            }
 
            if ( !GlobalUnlock( pMem ) && Marshal.GetLastWin32Error() != 0 )
            {
                GlobalFree( pMem );
                pMem = IntPtr.Zero;
            }
 
            return pMem;
        }
 
        unsafe private void button1_Click ( object sender, EventArgs e )
        {
            var ptr = GetDropFilesPtr(
                new string[] {
                    @"E:\Downloads\Video\SomeVideoFile.mkv"
                } );
            //var pointer = GlobalLock( ptr );
            var ret = PostMessage( (IntPtr)0x000E06F0 /* Main MPC window */, WM_DROPFILES, ptr, IntPtr.Zero );
            //var sb = new StringBuilder( 256 );
            //var sz = DragQueryFile( pointer, 0, sb, sb.Capacity );
            //GlobalUnlock( pointer );
            System.Threading.Thread.Sleep( 100 );
            GlobalFree( ptr );
            ...

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы