Archive for May 2014

Bắt sự kiện bật, tắt chương trình. Event start, stop process


thuvienwinform - C# hỗ trợ người lập trình biết được chương trình nào vừa được bắt đầu, chương trình nào vừa kết thúc thông qua sự kiện EventArrivedEventHandler của ManagementEventWatcher nằm trong bộ thư viện System.Management. Để bắt được các sự kiện này, đầu tiên chương trình phải có quyền admin. Để thực hiện gán quyền admin cho chương trình xem thêm tại: http://thuvienwinform.blogspot.com/2013/09/item-manifes-tchay-ung-dung-winform-voi-quyen-admin.html

Project demo: https://www.dropbox.com/s/es33d1d5413oqop/thuvienwinform-ManagermentEventWatcher%28KiemTraSuThayDoiCuaTaskMgr%29.rar

Sau khi thêm quyền admin cho chương trình, ta thoát visual ra và chạy lại nó với quyền admin
Chú ý: nếu không sử dụng được ManagementEventWatcher thì phải thực hiện Add reference System.Management bằng tay
Rồi, ok code như sau:
1. Bắt sự kiện chương trình mới được bật lên

void ChuongTrinhBat()
{
    WqlEventQuery q = new WqlEventQuery("Win32_ProcessStartTrace");
    ManagementEventWatcher w = new ManagementEventWatcher(q);
    w.EventArrived += new EventArrivedEventHandler(voidChuongTrinhBat);
    w.Start();
}

private void voidChuongTrinhTat(object sender, EventArrivedEventArgs e)
{
    string s = "";
    foreach (var pd in e.NewEvent.Properties)
        if(pd.Value != null)
            if (pd.Name == "ProcessName")// ngoai ra con co ProcessID, TIME_CREATED
                s += pd.Value.ToString() + "\n";
    MessageBox.Show("Co mot chuong trinh vua moi tat\n" + s);
}

2. Bắt sự kiện chương trình bị tắt đi

void ChuongTrinhTat()
{
    ManagementEventWatcher w1 = new ManagementEventWatcher("select ProcessName from Win32_ProcessStopTrace");
    w1.EventArrived += new EventArrivedEventHandler(voidChuongTrinhTat);
    w1.Start();
}
private void voidChuongTrinhBat(object sender, EventArrivedEventArgs e)
{
    string s = "";
    foreach (var pd in e.NewEvent.Properties)
        if (pd.Value != null)
            if (pd.Name == "ProcessName")// ngoai ra con co ProcessID, TIME_CREATED
                s += pd.Value.ToString() + "\n";
    MessageBox.Show("Co mot chuong trinh vua moi bat\n" + s);
}

- Ngoài ra có thể chỉnh lại cái đoạn select một chút để lấy những giá trị cần thiết như:
+ Lấy ProcessName: select ProcessName from Win32_ProcessStopTrace
+ Lấy thời gian: select TIME_CREATE from Win32_ProcessStartTrace
+...
5/31/2014
Đăng bởi :
Nhãn :

[CODE] Truyền dữ liệu qua lại giữa các Process và ứng dụng

thuvienwinform - Xin chào ! Hôm nay mình sẽ hướng dẫn truyền dữ liệu qua lại giữa các Process. Việc này tưởng như không quan trọng lắm nhưng thực ra nó rất cần thiết khi code các phần mềm liên quan tới quản lí máy tính như Antivirus....

I. Vấn đề
Chắc hẳn các bạn đã dùng nhiều phần mềm diệt virus và thấy luôn có 1 exe riêng cho Tray (chạy dưới khay taskbar). Hãy tự hỏi tại sao lại phải tách riêng ra như vậy mà không code gộp vào 1 exe cho dễ quản lí ???
Đơn giản thôi, vì cái Tray đó làm nhiệm vụ quản lí Runtime (thời gian thực -- chạy liên tục cùng máy tính) và nếu gộp vào thì sẽ rất ngốn RAM (Ram sẽ phải load cả phần giao diện ...) nên để hệ thống chạy "êm và không nặng nề" người ta đã làm Tray ra 1 exe riêng biệt . ^^ và bây giờ việc truyền dữ liệu giữa Process là vấn đề quan trọng

II. Giải quyết
Thời còn .NET Framework 3.0 trở xuống người ta vẫn phải truyền dữ liệu qua lại giữa Process thông qua File. Nhưng tới .NET 3.5 , đã có 1 công nghệ xuất hiện để giải quyết vấn đề này.

Hôm nay mình sẽ giới thiệu vs các bạn công nghệ Pipes - công nghệ này chạy theo mô hình Server/Client
(using System.IO.Pipes) tức là 1 process sẽ đóng vai trò như 1 máy chủ, các process khác gửi nhận dữ liệu thông qua Server.

Xem 1 ví dụ đơn giản nhé (Ví dụ vẫn là cách học dễ nhất nhỉ ^^)

* Server :
Form server của mình có 1 textbox và 1 nút
(ấn vào button sẽ gửi data trong textbox cho Client)
 
// Biến Server
private NamedPipeServerStream sv;

        public Server()
        {
            InitializeComponent(); 
        }

        private void Server_Load(object sender, EventArgs e)
        {
                   // Tạo server có tên "ServerTest"
            sv = new NamedPipeServerStream("ServerTest", PipeDirection.InOut);
                   // Đợi 1 client khác kết nối
            sv.WaitForConnection();
        }

        private void button1_Click(object sender, EventArgs e)
        {
              // Khi ấn Button1 - Gửi dữ liệu cho client (phải gửi dạng byte nhé)
            var data = Encoding.Unicode.GetBytes(this.textBox1.Text);
            sv.Write(data, 0, data.Length);
 
        }

* Client



Form Client chỉ có 1 ricktexbox để cập nhật


// Client
NamedPipeClientStream stream;

        public Client()
        {
            InitializeComponent();
            
        }

        private void Client_Load(object sender, EventArgs e)
        {
                 // Kết nối tới "ServerTest"
            stream = new NamedPipeClientStream("ServerTest");
            stream.Connect();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // Timer này cập nhật dữ liệu liên tục dưa vào RickTextbox mình đã tạo
            var re = new byte[1000];

            stream.Read(re, 0, 1000);
            string data = Encoding.Unicode.GetString(re);

            if (data != "")
                richTextBox1.Text += "\n" + data;
        }

Chạy server trước, sau đó chạy client và thử nhé ^^!

Ô xong rồi ^^!
Vậy đã truyền được dữ liệu giữa các process ^^
5/06/2014
Đăng bởi :
Nhãn :

[Code] Xử lí sự kiện cho nhiều Control

thuvienwinform - Chào ! Khi tạo form chắc hẳn bạn sẽ gặp rất nhiều control mà sẽ dùng chung một sự kiện. Nhất là đối với các hiệu ứng cho các control (Ví dụ như sự kiện MouseMove và MouseLeave...) Hôm nay chúng ta sẽ giải quyết vấn đề này. Cũng dễ thôi ^^

 I. VẤN ĐỀ 
Đối với một Form có rất nhiều Control ... và bạn muốn Form "Lung linh" hơn thì cần thêm hiệu ứng cho các Control trong Form. Ví dụ như khi trỏ chuột vào Lable thì chữ nó đậm lên - khi ngừng trỏ thì quay lại như ban đầu. >> Bình thường bạn phải tạo từng sự kiện cho từng Lable (mỗi Lable 2 sự kiện lận đó .. điều này tương đương với 2 procedure nhỏ) Mà ví dụ như có 100 Label thì sao nhỉ --> 200 sự kiện OMG ... Đủ chết rồi đấy ^^

II. GIẢI QUYẾT 
Đơn giản thôi, ở đây chúng ta sẽ tạo ra một lớp có đầy đủ các sự kiện ... và sau đó chỉ cần truyền Control vào lớp này là xong ^^! Bắt đầu nhé : Ở đây mình sẽ tạo lớp XULIHIEUUNG như sau :
 
public class XULIHIEUUNG
    {
        Control g_Control;

        public void TAOHIEUUNG(Control c)
        {
            g_Control = c;
            btn.MouseMove += new System.Windows.Forms.MouseEventHandler(MouseMoveEvent);
            btn.MouseLeave += new System.EventHandler(MouseLeaveEvent);
        }
        public void MouseMoveEvent(object sender, EventArgs e)
        {
            g_Control.Text = "Ô bắt được con chuột";
        }
        public void MouseLeaveEvent(object sender, EventArgs e)
        {
            g_Control.Text = "Chuột chạy mất rồi";
        }
    }

Trong hàm khởi tạo form chỉ cần thêm code sau bạn chỉ cần thêm code sau đây :

 new XULIHIEUUNG().TAOHIEUUNG(button1); 

 Bây giờ thử mở Form ra coi... Khi bạn trỏ chuột vào button1 và khi di chuyển chuột ra khỏi chỗ đó .. Xem thế nào :)) (1 dòng này = 6 dòng code tay đấy, chưa kể phải mở Properties của từng Control mà chọn sự kiện)

 OK, vậy là xong rồi. Đơn giản đúng không :D
5/04/2014
Đăng bởi :
Nhãn :

Nhận ngay 100$ cho VPS

Mua hàng ủng hộ page

Ủng hộ page

Nhãn

Code (45) Team Foundation Server (17) Database (14) News (14) product (13) toolbox (10) Linq (9) SoftDesign (8) XNA (6) API (5) Project (5) item (4)

- Bản quyền thuộc về Thư Viện WinForm - Giao diện: Metrominimalist - Thiết kế: Johanes Djogan -