將 Win32 訊息及函式放在一個Class中。修正部分錯誤,並加入
public static int sendWindowsStringMessage(IntPtr hWnd, int wParam, string msg);
得以直接以訊息列傳送字串。
PS: 被綁架的視窗應用程式,則該程式 ThisProcess.MainWindowHandel 將被改變為 0,而無法取得 hWSnd,即無法傳送訊息。(未找到解答方法)
Win32 Class : class Win32 { #region WIN32定義區 public enum ShowWindowStyles : short
{ SW_HIDE = 0,
SW_SHOWNORMAL = 1,
SW_NORMAL = 1,
SW_SHOWMINIMIZED = 2,
SW_SHOWMAXIMIZED = 3,
SW_MAXIMIZE = 3,
SW_SHOWNOACTIVATE = 4,
SW_SHOW = 5,
SW_MINIMIZE = 6,
SW_SHOWMINNOACTIVE = 7,
SW_SHOWNA = 8,
SW_RESTORE = 9,
SW_SHOWDEFAULT = 10,
SW_FORCEMINIMIZE = 11,
SW_MAX = 11
}
public const int WM_COPYDATA = 0x4A;
public const int SWP_NOOWNERZORDER = 0x200;
public const int SWP_NOREDRAW = 0x8;
public const int SWP_NOZORDER = 0x4;
public const int SWP_SHOWWINDOW = 0x0040;
public const int WS_EX_MDICHILD = 0x40;
public const int SWP_FRAMECHANGED = 0x20;
public const int SWP_NOACTIVATE = 0x10;
public const int SWP_ASYNCWINDOWPOS = 0x4000;
public const int SWP_NOMOVE = 0x2;
public const int SWP_NOSIZE = 0x1;
public const int GWL_STYLE = (-16);
public const int WS_VISIBLE = 0x10000000;
public const int WM_CLOSE = 0x10;
public const int WS_CHILD = 0x40000000;
public const int HWND_TOP = 0x0;
public const int WM_COMMAND = 0x0112;
public const int WM_QT_PAINT = 0xC2DC;
public const int WM_PAINT = 0x000F;
public const int WM_SIZE = 0x0005;
public const int WM_USER = 0x0400;
#region User_Message(自定義訊息) public const int SbMsgOffset = 100;
//..................................................................... // WM_USER_MESSAGE_1 => 通知 OWner, __ADAM6050UDP.exe 的 HWND // Lparam: HWnd // WParam: nonuse public const int WM_USER_MESSAGE_1 = WM_USER + SbMsgOffset;
//..................................................................... // WM_USER_MESSAGE_2 => 通知 OWner, DI_Value // Lparam: 此 ADAM6050 的IP 在 INI檔裡的Index // WParam: DI_Value (16 bits) public const int WM_USER_MESSAGE_2 = WM_USER + SbMsgOffset + 1; //..通知 OWner DI_Value
//..................................................................... // WM_USER_MESSAGE_3 => 通知 OWner __IP_Scand.exe 的 HWND // Lparam: HWnd // WParam: nonuse public const int WM_USER_MESSAGE_3 = WM_USER + SbMsgOffset + 2;
//..................................................................... // WM_USER_MESSAGE_4 => 通知 OWner, IP_Ping 的結果 // Lparam: 此 IP_Scan 的IP 在 INI檔裡的Index // WParam: 0:OK / 非0: ping不通 public const int WM_USER_MESSAGE_4 = WM_USER + SbMsgOffset + 3;
//..................................................................... // WM_USER_MESSAGE_5 => 保留未用 public const int WM_USER_MESSAGE_5 = WM_USER + SbMsgOffset + 4;
//..................................................................... // WM_USER_MESSAGE_6 => 通知 ADAM & IP_Scan 結束程式 public const int WM_USER_MESSAGE_6 = WM_USER + SbMsgOffset + 5;
#endregion
[DllImport("User32.dll")] public static extern Int32 RegisterWindowMessage(string lpString);
//For use with WM_COPYDATA and COPYDATASTRUCT [DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
//For use with WM_COPYDATA and COPYDATASTRUCT [DllImport("User32.dll", EntryPoint = "PostMessage")]
public static extern int PostMessage(IntPtr hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
[DllImport("User32.dll", EntryPoint = "PostMessage")]
public static extern int PostMessage(int hWnd, int Msg, int wParam, int lParam);
[DllImport("User32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(int hWnd);
[DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
public static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
public static extern long GetWindowLong(IntPtr hwnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
public static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
//public static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
[DllImport("user32.dll", SetLastError = true)]
public static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
public static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);
[DllImport("user32.dll")] public static extern void SetForegroundWindow(IntPtr hwnd);
//.. [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint newLong);
[DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern bool ShowWindow(IntPtr hWnd, short State);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
internal static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);
[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsWindow(IntPtr hWnd);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int GetProcessId(IntPtr hWnd);
public static IntPtr GethWnd(Process p)
{ return p.MainWindowHandle; }
internal struct RECT //Win32 數據結構
{ public int left;
public int top;
public int right;
public int bottom;
}
//Used for WM_COPYDATA for string messages public struct COPYDATASTRUCT
{ public IntPtr dwData; public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
//.. public static int sendWindowsStringMessage(IntPtr hWnd, int wParam, string msg)
{ int result = 0;
if (IsWindow(hWnd)) { byte[] sarr = System.Text.Encoding.Default.GetBytes(msg); int len = sarr.Length; COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = msg;
cds.cbData = len + 1;
result = SendMessage(hWnd, WM_COPYDATA, wParam, ref cds); }
return result; }
// //.. How to use "COPYDATASTRUCT" // /* ==<< Message Queue >>== protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_USER: break; case WM_COPYDATA: COPYDATASTRUCT mystr = new COPYDATASTRUCT(); Type mytype = mystr.GetType(); mystr = (COPYDATASTRUCT)m.GetLParam(mytype); //this.doSomethingWithMessage(mystr.lpData); break; } base.WndProc(ref m); } */ #endregion
#region 綁架外部程式視窗 //..以名稱檢察 Processes 是否存在 public static bool isProcesses(string ProName)
{ return (Process.GetProcessesByName(ProName).Length > 1); }
public static Process RunExe(String ExeFileName, String Arg)
{ Process p = new Process(); // 需要啟動的程序 //p.StartInfo.mResFile = @"C:\Windows\System32\notepad.exe"; p.StartInfo.FileName = ExeFileName;
p.StartInfo.Arguments = Arg;
// 最小化程序 p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
// 啟動 p.Start();
return (p); }
public static Process RunExeAndToChid(IntPtr ParentHandle, string ExeFileName, string args)
{ Process p = new Process(); // 需要啟動的程序 //p.StartInfo.mResFile = @"C:\Windows\System32\notepad.exe"; p.StartInfo.FileName = ExeFileName;
p.StartInfo.Arguments = args;
// 最小化程序 p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
// 啟動 p.Start();
// 必须等待,啟動程序的 Handol 未没有創建,不能控制程序 Thread.Sleep(5000);
// 最大化啟動程序 ShowWindow(p.MainWindowHandle, (short)ShowWindowStyles.SW_MAXIMIZE);
// 設置被绑架程序的父窗口 //SetParent(p.MainWindowHandle, this.Handle); SetParent(p.MainWindowHandle, ParentHandle);
// 改變尺寸 ResizeControl(p, ParentHandle);
return (p); }
// 控制嵌入程序的位置和尺寸 public static void ResizeControlEMS(Process p, IntPtr ParentHandle)
{ int TopOffset = -54;//-28;
int LeftOffset = -8;
SendMessage(p.MainWindowHandle, WM_COMMAND, WM_PAINT, 0);
PostMessage(p.MainWindowHandle, WM_QT_PAINT, 0, 0);
//.. 取得視窗大小 RECT tempRect = new RECT(); GetWindowRect(ParentHandle, ref tempRect);
SetWindowPos(p.MainWindowHandle,
HWND_TOP,
LeftOffset, // 0, // 设置偏移量,把原来窗口的菜单遮住 TopOffset,
tempRect.right - tempRect.left - LeftOffset + 10,// (int)this.Width, tempRect.bottom - tempRect.top - TopOffset + 6, // (int)this.Height, SWP_FRAMECHANGED);
SendMessage(p.MainWindowHandle, WM_COMMAND, WM_SIZE, 0);
}
public static void ResizeControl(Process p, IntPtr ParentHandle)
{ SendMessage(p.MainWindowHandle, WM_COMMAND, WM_PAINT, 0);
PostMessage(p.MainWindowHandle, WM_QT_PAINT, 0, 0);
//.. 取得視窗大小 RECT tempRect = new RECT(); GetWindowRect(ParentHandle, ref tempRect);
SetWindowPos(p.MainWindowHandle,
HWND_TOP,
0, // 设置偏移量,把原来窗口的菜单遮住 0,
tempRect.right - tempRect.left,// (int)this.Width, tempRect.bottom - tempRect.top, // (int)this.Height, SWP_FRAMECHANGED);
SendMessage(p.MainWindowHandle, WM_COMMAND, WM_SIZE, 0);
}
public static void ResizeControlHwnd(IntPtr pHWND, IntPtr ParentHandle)
{ //.. 取得視窗大小 RECT tempRect = new RECT(); GetWindowRect(ParentHandle, ref tempRect);
SetWindowPos(pHWND,
HWND_TOP,
0, // 设置偏移量,把原来窗口的菜单遮住 0,
tempRect.right - tempRect.left,// (int)this.Width, tempRect.bottom - tempRect.top, // (int)this.Height, SWP_FRAMECHANGED);
}
public static void KillProcessByName(string ProcName)
{ Process[] myProcesses = Process.GetProcessesByName(ProcName);
foreach (Process myProcess in myProcesses)
{ //if (myProcess.MainWindowTitle.Length > 0) { try { string buf = myProcess.MainModule.ModuleName;// .MainWindowTitle;
myProcess.Kill();
}
catch { } }
}
}
#endregion
}
沒有留言:
張貼留言