110,539
社区成员
发帖
与我相关
我的任务
分享
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
//接收自定义消息MYMESSAGE,并显示其参数
case 0x004A:
{
Win32API.COPYDATASTRUCT ml = new Win32API.COPYDATASTRUCT();
Type mytype = ml.GetType();
try
{
ml = (Win32API.COPYDATASTRUCT)m.GetLParam(mytype);
if (ml.lpData.Contains("MainHwnd|"))
{
MainFormList.Add(ml.lpData.Substring(ml.lpData.IndexOf("MainHwnd|")));
}
else if (ml.lpData.Contains("backhome返回主界面"))
{
}
else
{
}
}
catch { }
}
break;
default:
base.DefWndProc(ref m);
break;
}
}
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
//消息发送API
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(
IntPtr hWnd, // 信息发往的窗口的句柄
int Msg, // 消息ID
int wParam, // 参数1
int lParam //参数2
);
//消息发送API
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(
IntPtr hWnd, // 信息发往的窗口的句柄
int Msg, // 消息ID
int wParam, // 参数1
ref COPYDATASTRUCT lParam //参数2
);
//消息发送API
[DllImport("User32.dll", EntryPoint = "PostMessage")]
public static extern int PostMessage(
IntPtr hWnd, // 信息发往的窗口的句柄
int Msg, // 消息ID
int wParam, // 参数1
int lParam // 参数2
);
//异步消息发送API
[DllImport("User32.dll", EntryPoint = "PostMessage")]
public static extern int PostMessage(
IntPtr hWnd, // 信息发往的窗口的句柄
int Msg, // 消息ID
int wParam, // 参数1
ref COPYDATASTRUCT lParam // 参数2
);
}
public class ShowMsg
{
static IntPtr hwnd = IntPtr.Zero;
static Win32API.COPYDATASTRUCT ml = new Win32API.COPYDATASTRUCT();
static ShowMsg()
{
EnumChildWindows(IntPtr.Zero, EnumWindowsProc_, "");
}
const int WM_COPYDATA = 0x004A; //0x004A 0x61
public static void Show(string msg)
{
if(hwnd==IntPtr.Zero)
EnumChildWindows(IntPtr.Zero, EnumWindowsProc_, "");
ml.dwData = (IntPtr)100;
ml.lpData = Color.Black.ToArgb().ToString() + "|系统--" + msg;
//ml.r = 0;
//ml.g = 0;
//ml.b = 0;
byte[] sarr = System.Text.Encoding.Default.GetBytes(ml.lpData);
int len = sarr.Length;
ml.cbData = len + 1;
Win32API.SendMessage(hwnd, WM_COPYDATA, 0, ref ml);
}
public static void Show(Color c, string msg)
{
if (hwnd == IntPtr.Zero)
EnumChildWindows(IntPtr.Zero, EnumWindowsProc_, "");
ml.dwData = (IntPtr)100;
ml.lpData = c.ToArgb().ToString() + "|系统--" + msg;
//ml.r = c.R;
//ml.g = c.G;
//ml.b = c.B;
byte[] sarr = System.Text.Encoding.Default.GetBytes(ml.lpData);
int len = sarr.Length;
ml.cbData = len + 1;
Win32API.SendMessage(hwnd, WM_COPYDATA, 0, ref ml);
}
public delegate bool EnumChildWindow(IntPtr WindowHandle, string num);
public static bool EnumWindowsProc_(IntPtr hWnd, string lParam)
{
var sb = new StringBuilder(500);
GetClassName(hWnd, sb, sb.Capacity);
if (sb.ToString().Contains("这里是窗体类名"))
{
GetWindowText(hWnd, sb, sb.Capacity);
if (sb.ToString() == "这里是窗体标题")
{
hwnd = hWnd;
return false;
}
}
return true;
}
/// <summary>
/// 获取指定窗体的所有子窗体
/// </summary>
/// <param name="WinHandle">窗体句柄</param>
/// <param name="ec">回调委托</param>
/// <param name="name">自定义</param>
/// <returns></returns>
[DllImport("User32.dll")]
public static extern int EnumChildWindows(IntPtr WinHandle, EnumChildWindow ecw, string name);
/// <summary>
/// 获取窗体标题文本
/// </summary>
/// <param name="hWnd"></param>
/// <param name="lpString"></param>
/// <param name="nMaxCount"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "GetWindowText")]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
/// <summary>
/// 获取类名
/// </summary>
/// <param name="WinHandle"></param>
/// <param name="Type"></param>
/// <param name="size"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern int GetClassName(IntPtr WinHandle, StringBuilder Type, int size);
}
//返回值
public string RetValue { get; set;}
A窗体调用B窗体
Form _CurrentForm = (Form)Assembly.Load("B窗体所在的exe名称").CreateInstance("命名空间.B窗体类名称");
_CurrentForm.ShowDialog(ParentForm);
//B窗体返回值
string _Result = _CurrentForm.GetType().GetProperty("RetValue ").GetValue(_CurrentForm, null).ToString();