Potřeboval bych poradit jak otevírat soubory (asociované) v jedné a té samé instanci aplikace, nikoli aby každý soubor otevřel svoje vlastní okno. Program je napsán v C#.
Příklad:
1. Spustím soubor A a otevře se aplikace AA
2. Spustím soubor B a v otevřené aplikaci AA se otevře soubor B (nějak, pravděpodobně dojde k předání informace o tom jaký soubor to chci vlastně otevřít).
V nejhorším případě by šlo původni aplikaci zavřít (i kdyz to take nevim jak) a novou otevřít - ale to je takové divné.
Nápady, rady, návody, odkazy?
Fórum › .NET
Otvírat soubory v již otevřené aplikaci
To Petr : podivej se na http://www.codeproject.com/KB/cs/singleinstance.aspx akorat krom toho ze zcancelujes druhou app, posles prvni jeji argumenty, tzn co ma otevrit.. kdyby to nebylo jasne poslu zitra kod. Taky bys mohl vygooglovat neco jako "c# single instance application" treba to pomuze...
To Petr : Myslim ze tohle by mohlo helpnout. Kdyby ne, ptej se dal.. :)
Pro ty, kteri by neco podobneho hledali:
struct COPYDATASTRUCT
{
public int dwData;
public int cbData;
public IntPtr lpData;
}
static class Program
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
public const int WM_COPYDATA = 0x004A;
[STAThread]
static void Main()
{
bool OK; //urcuje zda je spustena pouze jedna instance programu
System.Threading.Mutex m = new System.Threading.Mutex(true, "TMUTrackInformation", out OK);
if (!OK)
{
Process proces = Process.GetCurrentProcess();
Process[] procesy = Process.GetProcessesByName(proces.ProcessName);
for (int i = 0; i < procesy.Length;i++ )
{
if (procesy[i].Id!=proces.Id)
{
if (Environment.GetCommandLineArgs().Length == 2)
{
string cestaKOtviranemuSouboru = Environment.GetCommandLineArgs()[1];
COPYDATASTRUCT data = new COPYDATASTRUCT();
data.dwData = 0;
data.cbData = Encoding.Unicode.GetByteCount(cestaKOtviranemuSouboru) + 2;//+2 je na koncovou nulu
data.lpData = Marshal.StringToHGlobalUni(cestaKOtviranemuSouboru);
IntPtr pointerNaStrukturu = Marshal.AllocHGlobal(Marshal.SizeOf(data));
Marshal.StructureToPtr(data,pointerNaStrukturu,true);
SendMessage(procesy[i].MainWindowHandle, WM_COPYDATA, proces.MainWindowHandle,pointerNaStrukturu );
return;
}
}
}
MessageBox.Show("One instance of this program only!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
GC.KeepAlive(m);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
A v hlavni aplikaci si hlidam smycku zprav:
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
const int WM_COPYDATA = 0x004A;
switch(m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT nStruktura = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof (COPYDATASTRUCT));
string cesta = Marshal.PtrToStringUni(nStruktura.lpData);
//MessageBox.Show(cesta,"Mas tu zpravu",MessageBoxButtons.OK, MessageBoxIcon.Information);
NactiSoubor(cesta);
this.Activate();
break;
}
base.WndProc(ref m);
}
Zjistit počet nových příspěvků
Přidej příspěvek
Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 58 hostů
Podobná vlákna
Otevrene soubory - input, output — založil Earl Cash
Jak provázat soubory, když chci využít třídu A pro objekt B a každá… — založil PazziCZ
Realokace 2D pole (zvetšení již existující matice) v C++ — založil ondrej39
C# - Text v Console.WriteLine, kde je již nějaká funkce — založil jokerx
Tvorba webových stránek již od 3000Kč, tvorba 3D, mobilní aplikace p… — založil Programátor
Moderátoři diskuze