Ответ 1
Пример одного приложения
bool createdNew;
Mutex m = new Mutex(true, "YOURAPPNAME", out createdNew);
if (!createdNew)
{
MessageBox.Show("already running!");
return;
}
Я зарегистрировал свое приложение в файлах ".mp3".
Мое приложение - это приложение с одним экземпляром.
Цель: когда пользователь открывает mp3 файл, если myApp не запущен. Запустится запуск и покажет количество выбранных файлов в проводнике, покажите окно приложения и покажите количество выбранных файлов в проводнике (только один раз). Затем вызовите функцию в форме приложения, которая добавляет элементы mylist
к listbox1
.
Вторая проблема: результаты, которые я получаю, когда вызов mylist
в форме приложения отличается от результатов в myfunc()
, почему он отличается?
Я добавил комментарии, которые могут помочь!
Я думаю, что мой вопрос ясен! если это не говорит мне, чтобы было ясно.
[STAThread]
static void Main(string[] args)
{
if (SingleApplicationDetector.IsRunning())
{// These Codes Runs n times!
myfunc(); // But I want this Code Run just one time!
return;
}
//myfunc();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
SingleApplicationDetector.Close();
}
public static class SingleApplicationDetector
{
public static bool IsRunning()
{
string guid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString();
var semaphoreName = @"Global\" + guid;
try
{
__semaphore = Semaphore.OpenExisting(semaphoreName, SemaphoreRights.Synchronize);
Close();
return true;
}
catch (Exception ex)
{
__semaphore = new Semaphore(0, 1, semaphoreName);
return false;
}
}
public static void Close()
{
if (__semaphore != null)
{
__semaphore.Close();
__semaphore = null;
}
}
private static Semaphore __semaphore;
}
public static List<string> mylist = new List<string>();
public static System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("ACE Music Player");
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
public static void myfunc()
{
if (!File.Exists("1.txt")) // I somehow achieved my goal by using this but it does not work very well for large number of files, and of course there should be a better solution!
{
File.WriteAllText("1.txt", "testing");
if (p.Length > 0)
{
for (int i = 0; i < p.Length; i++)
{
SetForegroundWindow(p[i].MainWindowHandle);
}
}
// MessageBox.Show("Running");
{
try
{
string filename;
List<string> selected = new List<string>();
foreach (SHDocVw.InternetExplorer window in new SHDocVw.ShellWindows())
{
filename = Path.GetFileNameWithoutExtension(window.FullName).ToLower();
if (filename.ToLowerInvariant() == "explorer")
{
Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
foreach (Shell32.FolderItem item in items)
{
if (item.Path.StartsWith(System.Environment.CurrentDirectory))
{
selected.Add(item.Path);
// mylist.Add(item.Path);
// MessageBox.Show("FilePath: " + selected[selected.Count - 1]);
}
/*
MessageBox.Show(Environment.GetCommandLineArgs().GetValue(1).ToString());
int myint = Environment.GetCommandLineArgs().GetValue(1).ToString().LastIndexOf(".");
MessageBox.Show(myint.ToString());
string str = Environment.GetCommandLineArgs().GetValue(1).ToString().Remove(myint);
MessageBox.Show(str);
if (item.Path.StartsWith(str))
{
MessageBox.Show(item.Path);
selected.Add(item.Path);
}
*/
// selected.Add(item.Path);
}
}
}
mylist.AddRange(selected);
// Thread.Sleep(TimeSpan.FromMilliseconds(3000));
//TotalLines("");
// if (!File.Exists("1.txt"))
// {
//// File.WriteAllLines("1.txt", mylist.ToArray());
// test();
//// File.WriteAllText("2.txt", File.ReadAllText("1.txt"));
//// File.Delete("1.txt");
MessageBox.Show(mylist.Count.ToString()+": "+mylist[mylist.Count - 1]);
// Thread.Sleep(TimeSpan.FromMilliseconds(3000));
// File.WriteAllText("3.txt", "Done!");
// Thread.Sleep(500);
File.Delete("1.txt");
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
}
}
Обновить = > Это то, что я хочу сделать: Вершина игроков
Страница загрузки SDK для Windows
Я обновлю этот пост, когда полностью обработаю свою проблему!
но, по крайней мере, и, наконец, я получил решение, которое искал. Надеюсь, эта тема тоже поможет другим людям.
Моя текущая проблема заключается в том, что образец написан на С++, и я до сих пор не понимаю его!
и мне нужно смешать его с моим приложением (написано на С#). Если это возможно!!??
Пример одного приложения
bool createdNew;
Mutex m = new Mutex(true, "YOURAPPNAME", out createdNew);
if (!createdNew)
{
MessageBox.Show("already running!");
return;
}