신입 시절 구현했던 공유메모리를 통한 프로그램 실행 및 종료이다.
WMI 제어를 통한 네트워크 연결을 활성화, 비활성화 하는 프로그램을 제어하는데 사용했다.
Visual Studio로 코드 짠게 아니라, 코드 스크립트에서 예전에 구현했던 걸 보고 다시 한거라 오타가 있을수도 ^^;
코드는 다음과 같다.
프로그램이 실행상태인지 확인 후, 정보를 보내는 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | using System; using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Diagnostics; using System.Windows.Forms; class ProcessManager { Process process; [DllImport("user32.dll")] public static extern IntPtr sendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr IParam); [DllImport("user32.dll", ChartSet = CharSet.Auto)] public static extern IntPtr FindWindow(string, lpClassName, string lpWindowName); public const int WM_COPYDATA = 0x004A; public struct COPYDATASTRUCT { public IntPtr dwData; public int cdData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } public void Run() { try { string processName = "ProcessCheck"; Int32 hw = (Int32)FindWindow(null, processName); if(hw == 0) { process = Process.Start(processName); } } catch(Exception ex) { MessageBox.show(ex.message); } } public void Close() { try { process.Close(); } } public void Connection() { try { MessageSend("ProcessCheck", "Connection"); } catch(Exception ex) { MessageBox.show(ex.message); } } private void MessageSend(string programName, string message) { try { COPYDATASTRUCT dataStruct = new COPYDATASTRUCT(); dataStruct.dwData = (IntPtr)0; dataStruct.cdData = message * 2 + 1; //한글길이 지원 dataStruct.lpData = message; IntPtr wndPtr = FindWindow(null, programName); if(wndPtr > IntPtr.Zero) { IntPtr temp = Marshal.AllocHGlobal(Marshal.Sizeof(typeof(COPYDATASTRUCT))); Marshal.StructureToPtr(dataStruct, temp, true); SendMessage(wndPtr, WM_COPYDATA, IntPtr.Zero, temp); } } catch(Exception ex) { MessageBox.show(ex.message); } } } | cs |
받는 쪽 작업 코드. WMI를 통해 네트워크를 활성화 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | //네임스페이스 및 Using 생략 public partial class ProcessCheck { public const int WM_COPYDATA = 0x004A; private int time = 0; public statuc COPYDATASTRUCT { public IntPtr dwData; public int cdData; [MarshalAs(UmmanagedType.LPStr)] public string lpData; } //여기서는 폼으로 Timer를 사용, 쓰레드나, backGround, Task 등은 취향에 맞게 구현하길 바란다. public ProcessCheck() { InitializeComponent(); } //Envet private void ProcessCheck_Load(object sender, EventArgs e) { timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) { time = time + 1; lblTime.Text = time.Tostring(); if(time > 0) { NetWorkEnable("enable"); timer1.Stop(); this.Close(); } } //Override protected override void WndProc(ref Message m) { switch(m.Msg) { case WM_COPYDATA: messageCheck(ref m); break; } base.WndProc(ref m); } private void NetWorkEnable(string keyword) { ManagementClass wmiClass = new ManagementClass("Win_NetworkAdapter"); ManagementObjectCollection wmiObjectCollection = wmiClass.GetInstances(); foreach(ManagementObject managementObject in wmiObjectCollection) { if(managementObject["NetEnabled"] != null) { ManagementBaseObject enable = managementObject.InvokeMethod(keyword, null, null); } } } } | cs |
WMI 사용 참고 사이트
https://msdn.microsoft.com/en-us/library/aa394579(v=vs.85).aspx
'C#' 카테고리의 다른 글
06# 네트워크 활성화/비활성화 (0) | 2016.05.11 |
---|---|
05# 소켓 비동기식 처리 (0) | 2016.04.18 |
04# 속성(Property) 객체 생성 시 초기화 (0) | 2016.04.18 |
03# 외부 dll 타입제어(dev express) (0) | 2016.04.18 |
02#INI 파일 읽기 쓰기 (0) | 2016.04.18 |