Otvírat soubory v již otevřené aplikaci – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Otvírat soubory v již otevřené aplikaci – .NET – Fórum – Programujte.comOtvírat soubory v již otevřené aplikaci – .NET – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
24. 1. 2008   #1
-
0
-

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?

Nahlásit jako SPAM
IP: 89.102.229.–
25. 1. 2008   #2
-
0
-

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...

Nahlásit jako SPAM
IP: 89.176.117.–
Petr
~ Anonymní uživatel
746 příspěvků
26. 1. 2008   #3
-
0
-

Jak vytvorit aplikaci, tak aby se pustila jen jedna instance to vim, ale nevim jak predat te druhe aplikaci nazev toho souboru. (Pres zpravy mi to nejak nejde - asi to pisu spatne). Za ukazku bych byl vdecny.

Nahlásit jako SPAM
IP: 89.102.229.–
26. 1. 2008   #4
-
0
-

To Petr : Myslim ze tohle by mohlo helpnout. Kdyby ne, ptej se dal.. :)

Nahlásit jako SPAM
IP: 194.213.32.–
Petr
~ Anonymní uživatel
746 příspěvků
26. 1. 2008   #5
-
0
-

Diky prostuduju si to.

Nahlásit jako SPAM
IP: 89.102.229.–
Petr
~ Anonymní uživatel
746 příspěvků
26. 1. 2008   #6
-
0
-

Tak jsem to nakonec vyresil. Pouzil jsem WM_COPYDATA a externi deklaraci funkce a posilam si mezi aplikacema zpravy - a funguje to vyborne :-) . Pokud by nekdo mel zajem tak muzu postnout.

Nahlásit jako SPAM
IP: 89.102.229.–
Petr
~ Anonymní uživatel
746 příspěvků
29. 1. 2008   #7
-
0
-

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);

}

Nahlásit jako SPAM
IP: 89.102.229.–
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žit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 24 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý