它的WPF窗口应用程序。我要实现的目标是将命令行参数传递给该应用程序,一旦收到命令行参数,就必须将WM_COPYDATA消息传递给DefWndProc,在其中编写了函数来处理命令行参数。但是我的主要问题是仅在一台机器上,DefWndProc中未接收到WM_COPYDATA消息,因此它不处理命令行消息是使用以下方式发送的:
int len = arr.Length; COPYDATASTRUCT CopyDataStruct;
CopyDataStruct.dwData = (IntPtr)100;
CopyDataStruct.cbData = (len + 1)*2;
CopyDataStruct.lpData = args
SendMessage(Wnd, WM_COPYDATA, 0, ref CopyDataStruct)
//Receiving side for working scenario
protected override void DefWndProc(ref Message m)
m.MSG=74 m.LParam=9430768 m.WParam=0
这种异常行为背后的原因可能是什么,任何其他进程都阻止了邮件?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
public const int WM_COPYDATA = 0x4A;
public const UInt32 WM_COMMAND = 0x0111;
public const UInt32 IDM_MENU_SECUREDISCONNECT = 305;
public const UInt32 PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpData;
}
[DllImport("User32.dll", EntryPoint = "SendMessage", SetLastError = true)]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
private const string MARKER = "MARKER\n";
static void Main(string[] args)
{
IntPtr destWnd = (IntPtr)int.Parse(args[0]);
string packedargs = DAZZLE_MARKER + String.Join("\n", args[1]);
/
byte[] sarr = System.Text.Encoding.Unicode.GetBytes(packedargs);
int len = sarr.Length;
COPYDATASTRUCT CopyDataStruct;
CopyDataStruct.dwData = (IntPtr)100;
CopyDataStruct.cbData = (len + 1) * 2;
CopyDataStruct.lpData = packedargs;
int result = SendMessage(destWnd, WM_COPYDATA, 0, ref CopyDataStruct);
}
}
}
我提供了示例应用程序,该应用程序已成功向我的应用程序DefWndProc发送消息 但是,如果我将示例应用程序重命名为我的应用程序,则不会在主实例的DefWndProc中收到消息