using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace DyLine { public class clsMsg { [DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)] private static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam); [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)] private static extern IntPtr GetParent(IntPtr hWnd); [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")] private static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId); [DllImport("user32.dll", EntryPoint = "IsWindow")] private static extern bool IsWindow(IntPtr hWnd); private const int WM_COPYDATA = 0x004A; public struct COPYDATASTRUCT { public IntPtr dwData; public int cData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(int hwnd, int msg, int wParam, ref COPYDATASTRUCT IParam); private delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam); public void SendMsg(int handle, int wParam, string str) { byte[] arr = System.Text.Encoding.Default.GetBytes(str); int len = arr.Length; COPYDATASTRUCT cdata; cdata.dwData = (IntPtr)100; cdata.lpData = str; cdata.cData = len + 1; SendMessage(handle, WM_COPYDATA, wParam, ref cdata); } readonly string msgText = ""; readonly int _wParam = 0; //public void SendMsgToryProcess(int wParam,string str) //{ // IntPtr ptrWnd = IntPtr.Zero; // Process[] items = Process.GetProcessesByName("ryProcessManager"); // msgText = str; // _wParam = wParam; // for (int i = 0; i < items.Length; i++) // { // uint uiPid = (uint)items[i].Id; // 进程 ID // bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid); // } //} public void SendMsgToryProcess(int wParam, string str) { for (int i = 1; i < 5; i++) { object mainHandle = ryCommon.Model.ryMemoryShare.ReadFromMemory(1024, typeof(int), "ryProcessManager" + i.ToString()); if (mainHandle != null) { SendMsg((int)mainHandle, wParam, str); break; } } } public void SendMsgToryProcess(int wParam, string MemoryId, string str) { if (MemoryId == null || MemoryId.Length == 0) { SendMsgToryProcess(wParam, str); } else { object mainHandle = ryCommon.Model.ryMemoryShare.ReadFromMemory(1024, typeof(int), MemoryId); if (mainHandle != null) { SendMsg((int)mainHandle, wParam, str); } } } public static string GetMsg(Message m) { COPYDATASTRUCT cdata = new COPYDATASTRUCT(); Type mytype = cdata.GetType(); cdata = (COPYDATASTRUCT)m.GetLParam(mytype); return cdata.lpData; } private bool EnumWindowsProc(IntPtr hwnd, uint lParam) { uint uiPid = 0; if (GetParent(hwnd) == IntPtr.Zero) { GetWindowThreadProcessId(hwnd, ref uiPid); if (uiPid == lParam) // 找到进程对应的主窗口句柄 { SendMsg(hwnd.ToInt32(), _wParam, msgText); //return false; // 返回 false 以终止枚举窗口 } } return true; } } }