Получить пути к выделенным файлам - 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"));
}
}
}