A nebo si vytvor trimistne pole (nebo n+1 mistne pokud bys chtel i vice cisel), a ulozis nactene cislo na nultou pozici, pak setridis a zase zapises na nultou pozici dalsi cislo a opet setridis,..., a na konci bude na druhe pozici nejvetsi cislo a na prvni bude druhe nejvetsi...to co je na nultem uz nikoho nezajima
Příspěvky odeslané z IP adresy 89.102.229.–
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);
}
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.
Diky prostuduju si to.
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.
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?