Получить пути к выделенным файлам - C#

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

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

Как получить пути

НЕ через аргументы вызова

? Дело в том, что в путях везде понатыканы пробелы, ну и, понятное дело, в аргументах для каждого файла получается не его путь, а некая нарезка из фрагментов пути.

Решение задачи: «Получить пути к выделенным файлам»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Forms;
using System.Drawing;
 
namespace MultiImpact
{
    public partial class Form1 : Form
    {
        private int WM_IME_NOTIFY = 0x0282;
        private int WM_DESTROY = 0x0002;
        private int WM_NCDESTROY = 0x0082;
        static int WM_CLOSE = 0x0010;
        private int IMN_CLOSESTATUSWINDOW = 0x0001;
        private int WM_KILLFOCUS = 0x0008;
        private int WM_COMMAND = 0x0011;
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
 
        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern bool MoveWindow(IntPtr hwnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
 
        [DllImport("USER32.DLL")]
        private static extern int GetWindowText(IntPtr IntPtr, StringBuilder lpString, int nMaxCount);
 
        [DllImport("User32.Dll")]
        public static extern void SetWindowText(IntPtr hwnd, String lpString);
 
        [DllImport("User32.dll")]
        public static extern IntPtr GetParent(IntPtr hWnd);
 
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowProc lpEnumFunc, WinInfo win);
        public delegate bool EnumWindowProc(IntPtr hWnd, WinInfo win);
 
        public class WinInfo
        {
            public string NameStr;
            public IntPtr Handle;
            public WinInfo(string title) { NameStr = title; Handle = new IntPtr(); }
        }
 
        static bool FindWindowByTitle(IntPtr hwnd, WinInfo win)
        {
            StringBuilder str = new StringBuilder(200);
            GetWindowText(hwnd, str, 180);
            if (!str.ToString().Contains(win.NameStr))
                return true;
            win.Handle = hwnd;
            return false;
        }
 
        static bool FindWindowByClassName(IntPtr hwnd, WinInfo win)
        {
            StringBuilder str = new StringBuilder(200);
            GetClassName(hwnd, str, 180);
            if (!str.ToString().Contains(win.NameStr))
                return true;
            win.Handle = hwnd;
            return false;
        }
 
        public Form1(string[] args)
        {
            InitializeComponent();
            DaduDadu(args);
        }
 
        void DaduDadu(string[] args)
        {
            const string rus = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя ";
            const string lat = "abvgdeYZzijklmnoprstufhcCWVXyxEUA_";
            const string LabelClassName = "WindowsForms10.STATIC.app.0.14fd2b5";
            string exe = System.Reflection.Assembly.GetExecutingAssembly().Location;
            string tut = Path.GetDirectoryName(exe);
            List<string> arguments = args.ToList<string>();
            string sourse = "";
            foreach (string arg in arguments)
                sourse += arg;
            if (sourse == "")
            {
                foreach (Process pr in Process.GetProcessesByName("impacthost"))
                    pr.Kill();
                return;
            }
            string ext = Path.GetExtension(@sourse).ToLower();
            string dest = Path.GetFileName(@sourse);
            foreach (char ch in dest)
                if (rus.Contains(ch))
                {
                    char lch = lat[rus.IndexOf(ch)];
                    dest = dest.Replace(ch, lch);
                }
            dest = tut + '\\' + dest;
            File.Copy(sourse, dest, true);
            Process currentProc = Process.GetCurrentProcess();
            string procName = currentProc.ProcessName;
            Process[] multiImpacts = Process.GetProcessesByName(procName);
            WinInfo wInf = new WinInfo(LabelClassName);
            EnumChildWindows(multiImpacts[0].MainWindowHandle, 
                FindWindowByClassName, wInf);          //Ищем Label в нулевом мультиИмпакте.
            SetWindowText(wInf.Handle, dest + '\r');  //Передаём туда свой аргумент (можно и самому себе, ничё страшного).
            if (multiImpacts.Count() > 1 && currentProc != multiImpacts[0])
                currentProc.Kill();//Раз это не нулевой мультиИмпакт, то отдали аргумент нулевому, и делаем харакири.
            string impactPath = File.ReadAllLines(tut + '\\' + "impact.p")[0];
            arguments = label1.Text.Split('\r').ToList<string>();
            foreach (string s in arguments)
            {
                Process p = new Process();
                p.StartInfo.FileName = impactPath;
                switch (ext)
                {
                    case ".jed":
                        {
                            p.StartInfo.Arguments = "-j " + s;
                            break;
                        }
                    case ".bit":
                        {
                            p.StartInfo.Arguments = "-b " + s + " -mode sserial";
                            break;
                        }
                    default:
                        {
                            p.StartInfo.Arguments = "-j " + s;
                            break;
                        }
                }
                p.Start();
            }
            List<Process>impactsList=new List<Process>();
            StringBuilder newImpactTitle = new StringBuilder(200);
            while (impactsList.Count <= arguments.Count || newImpactTitle.ToString() == "")
            {       //Ждём, пока не оживёт последний из импактов.
                impactsList = Process.GetProcessesByName("impacthost").ToList<Process>();
                impactsList = impactsList.OrderBy(x => x.StartTime).ToList<Process>();
                if (impactsList.Count > 0)
                    GetWindowText(impactsList.Last().MainWindowHandle, newImpactTitle, 200);
            }
            foreach(Process p in Process.GetProcessesByName("_impact")) p.Kill();//Грохнули все импактные тупые консоли
            WinInfo targetWindow = new WinInfo("Gq_MvWorkspace" );
            Point position = new Point(0, 0);
            Size size = new Size(160, 210);
            foreach (Process p in Process.GetProcessesByName("impacthost"))
            {
                EnumChildWindows(p.MainWindowHandle, FindWindowByTitle, targetWindow);
                IntPtr grandFather = GetParent(GetParent(targetWindow.Handle));
                List<IntPtr> childWindows = new List<IntPtr>() { grandFather };
                EnumChildWindows(grandFather, new EnumWindowProc((hwnd, win) =>
                    { childWindows.Add(hwnd); return true; }), new WinInfo(""));
                EnumChildWindows(p.MainWindowHandle, new EnumWindowProc((hwnd, win) =>
                {
                    if (!childWindows.Contains(hwnd))
                        SendMessage(hwnd, WM_CLOSE, 0, 0);
                    return true;
                }
                ), new WinInfo(""));
                foreach (Process pr in impactsList)
                {
                    MoveWindow(pr.MainWindowHandle, (int)position.X, (int)position.Y, (int)size.Width, (int)size.Height, true);
                    SetForegroundWindow(pr.Handle);
                    position.Offset(size.Width, 0);
                    if (position.X >= 1280) position.Offset(-size.Width, size.Height);
                }
            }
        }
 
        private void Form1_Click(object sender, EventArgs e)
        {
            Process p = Process.GetCurrentProcess();
            EnumChildWindows(p.MainWindowHandle, FindWindowByClassName,
                new WinInfo("WindowsForms10.STATIC.app.0.14fd2b5"));
        }
    }
}

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


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

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

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