Я новичок в С# и IPC, пытаюсь создать приложение, которое является единственным экземпляром, и когда другой процесс пытается запустить его, он просыпается уже работающим экземпляром приложения и передает ему args
. Все работает в соответствии с моими потребностями. Но одна проблема заключается в том, что я не знаю, как установить дескриптор назначения в program.cs
, поэтому он отправляет сообщение только в целевое приложение. в настоящее время он транслирует глобальную и другую программу (мини-гет), которая также прослушивает HWND_BROADCAST
прием и пробуждение. Мой уже запущенный экземпляр также слушает его. Я хочу установить целевой дескриптор для (IntPtr)NativeMethods.HWND_BROADCAST
static Mutex mutex = new Mutex(true, "mutex-unique-string-id");
[STAThread]
static void Main(string[] args)
{
if (mutex.WaitOne(TimeSpan.Zero, true))
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (args.Length == 0)
{
Application.Run(new MainForm(null));
}
else
{
Application.Run(new MainForm(args[0]));
}
mutex.ReleaseMutex();
}
else
{
if (args.Length == 0)
{
SendMessageClass.SendMessageWithDataUsingHGlobal((IntPtr)NativeMethods.HWND_BROADCAST, "", IntPtr.Zero);
}
else
{
SendMessageClass.SendMessageWithDataUsingHGlobal((IntPtr)NativeMethods.HWND_BROADCAST, args[0], IntPtr.Zero);
}
}
}
Класс SendMessage
public class SendMessageClass
{
[System.Runtime.InteropServices.DllImport("user32.dll",CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(System.IntPtr hwnd, int msg,
IntPtr wparam, IntPtr lparam);
const int WM_COPYDATA = 0x4A;
const int WM_CLOSE = 0x0010;
public static void SendMessageWithDataUsingHGlobal(IntPtr destHandle, string str, IntPtr srcHandle)
{
COPYDATASTRUCT cds;
cds.dwData = srcHandle;
str = str + '\0';
cds.cbData = str.Length + 1;
cds.lpData = Marshal.AllocHGlobal(str.Length);
cds.lpData = Marshal.StringToHGlobalAnsi(str);
IntPtr iPtr = Marshal.AllocHGlobal(Marshal.SizeOf(cds));
Marshal.StructureToPtr(cds, iPtr, true);
// send to the MFC app
SendMessage(destHandle, WM_COPYDATA, srcHandle, iPtr);
// Don't forget to free the allocatted memory
Marshal.FreeCoTaskMem(cds.lpData);
Marshal.FreeCoTaskMem(iPtr);
}
}
Вндпрок
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
// program receives WM_COPYDATA Message from target app
case WM_COPYDATA:
if (m.Msg == WM_COPYDATA)
{
// get the data
COPYDATASTRUCT cds = new COPYDATASTRUCT();
cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
if (cds.cbData > 0)
{
byte[] data = new byte[cds.cbData];
Marshal.Copy(cds.lpData, data, 0, cds.cbData);
Encoding unicodeStr = Encoding.ASCII;
MessageBox.Show(new string(unicodeStr.GetChars(data)), "Received");
}
}
break;
}
base.WndProc(ref m);
}
WM_COPYDATA
. Я обновил вопросы с кодомSendMessageClass
иWndProc
. Не могли бы вы проверить и помочь мне. Спасибо - person aadi1295   schedule 17.04.2020args
вForm1
? - person aadi1295   schedule 17.04.2020eventArgs.CommandLine
, передайте его публичному методу Form1. - person Hans Passant   schedule 17.04.2020OnStartupNextInstance
, я получаю сообщение об ошибке'Form' does not contain a definition for 'Form1_New_Instance_Method' and no accessible extension method 'Form1_New_Instance_Method' accepting a first argument of type 'Form' could be found (are you missing a using directive or an assembly reference?)
- person aadi1295   schedule 17.04.2020