• <button id="ywcoc"><input id="ywcoc"></input></button>
  • <object id="ywcoc"><blockquote id="ywcoc"></blockquote></object>
    <table id="ywcoc"></table>
  • 技術資料
    C# 收發和處理懲罰自定義的WINDOWS消息
    時間:2016-06-28 15:06:38     點擊數:3010 次
    為了法度啟動后主動履行主函數,在Form1_Load中直接履行啟動函數,可能造成沒有反響。當然,在Form1_Load中參加較長時候(比如2秒)的按時器,在按時器函數中封閉按時器(僅須要履行一次),再履行主函數會好些,然則我們不知道初始話的正確時候,如許的辦法也存在危險。
    我們知道WINDOWS應用法度是靠消息驅動的,最好的辦法就是在Form1_Load中發送消息,本身截獲消息后,才開端履行斗勁安然。下面分3步申明相干的辦法步調。思馳科技

    一、創建一個 C# 項目,并選擇 Windows 應用法度,名稱默認WindowsFormsApplication1

    為了簡單,所有項目都按默認值處理懲罰。



    二、添加處理懲罰Windows 消息的辦法,即重載 DefWndProc辦法


    點選菜單[視圖]->[對象瀏覽器],打開對象瀏覽窗口(有的可能在[其他窗口]),在此中找到本身應用法度名WindowsFormsApplication1(一般在最下部),展開它并選中基類型Form,這時在右邊的窗口列出所有Form類的成員函數,你也可以更改本窗口上邊的[對象瀏覽器設置],從中勾選更多選項,以便呈現更多的函數,如圖所示:
    protected override void DefWndProc(ref System.Windows.Forms.Message m)



    我們選中DefWndProc(ref System.Windows.Forms.Message),此時鄙人面窗口會顯示完全的函數protected override void DefWndProc(ref System.Windows.Forms.Message m),我們右擊這行申明字符串,點選復制將其復制下來。轉到窗口Form1.cs,粘貼到Form1類里面,重視前面的override關鍵字,恰當批改就可以處理懲罰自定義消息了。
    protected override void DefWndProc(ref System.Windows.Forms.Message m)
    {
    switch (m.Msg)
    {
    case USER+1:
    //string message = string.Format("收到本身消息的參數:{0},{1}", m.WParam, m.LParam);
    //處理懲罰啟動 函數MessageBox.Show(message);//顯示一個消息框
    StartProcess();
    break;
    default:
    base.DefWndProc(ref m);//必然要調用基類函數,以便體系處理懲罰其它消息。
    break;
    }
    }


    三、引入發送消息的函數


    我們須要PostMessage發送自定義消息,所以用如下語句引用它:
    [DllImport("user32.dll")]
    public static extern void PostMessage(IntPtr hWnd, int msg, int wParam, int lParam);


    自定義消息號一般開端于0 x0400,也定義一個常量 public const int USER = 0 x0400;
    如許就可以在Form1_Load中發送消息,以便主動開端履行法度。
    private void Form1_Load(object sender, EventArgs e)
    {
    //Thread.Sleep(100); //守候100毫秒
    PostMessage(this.Handle, USER + 1, 168, 51898);
    }


    四 引用關鍵字的定名空間


    對于上方的關鍵字DllImport,字符要正確,大小寫也要正確,此時是黑色字體,還不熟悉,那就須要引用它的定名空間,辦法如下,應用鼠標右擊關鍵字DllImport,——解析——點選using System.Runtime.InteropServices ,即將所用的定名空間using System.Runtime.InteropServices;參加到項目中,關鍵字DllImport的字體變成綠色。



    五 完全代碼如下:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Runtime.InteropServices;


    namespace WindowsFormsApplication1
    {
    public partial class Form1 : Form
    {


    public const int USER = 0 x0400;//用戶自定義消息的開端數值

    [DllImport("user32.dll")]
    public static extern void PostMessage(IntPtr hWnd, int msg, int wParam, int lParam);



    public Form1()
    {
    InitializeComponent();
    }


    private void Form1_Load(object sender, EventArgs e)
    {
    //Thread.Sleep(100); //守候100毫秒
    PostMessage(this.Handle, USER + 1, 168, 51898);
    }


    private void StartProcess()
    {
    MessageBox.Show("具備前提,可以正常運行了!");
    }


    protected override void DefWndProc(ref System.Windows.Forms.Message m)
    {
    switch (m.Msg)
    {
    case USER+1:
    //string message = string.Format("收到本身消息的參數:{0},{1}", m.WParam, m.LParam);
    StartProcess();
    break;
    default:
    base.DefWndProc(ref m);//必然要調用基類函數,以便體系處理懲罰其它消息。
    break;
    }
    }


    }
    }


    六 有關的圖片


    點此查看有關 的圖片



    1.建樹項目標圖片





    2.彈出對象瀏覽器的圖片





    3.選擇基類型Form的圖片申明





    4.對象瀏覽器設置的圖片申明





    5.參加重載辦法DefWndProc的圖片申明





    6.引用關鍵字定名空間的圖片申明







    ==更多可以參考網上內容==


    ==1==
    c# Windows消息列表
    http://www.beijibear.com/index.php?aid=139


    ==2==
    「C#:windows消息大全-具體-有申明」
    http://www.mox.cc/018e4d33b5bc0402-ddec43ad9d5cedd0.htm


    ==3==
    c# Windows消息處理懲罰過程商量
    http://blog.csdn.net/jjjfox/article/details/7360378

    一、消息概述


    Windows下應用法度的履行是經由過程消息驅動的。消息是全部應用法度的工作引擎,我們須要懂得把握編程說話是如何封裝消息的道理。


    1 什么是消息(Message)


    消息就是通知和號令。在.NET框架類庫中的System.Windows.Forms定名空間中微軟采取面對對象的體式格式從頭定義了Message。新的消息(Message)布局的公共項目組屬性根蒂根基與早期的一樣,不過它是面對對象的。
    公共屬性:


    HWnd    獲取或設定消息的處理懲罰函數
    Msg     獲取或設定消息的ID號
    Lparam  指定消息的LParam字段
    Wparam  指定消息的WParam字段
    Result  指定為響應消息處理懲罰函數而向OS體系返回的值


    2 消息驅動的過程


    所有的外部事務,如鍵盤輸入、鼠標移動、按動鼠標都由OS體系轉換成響應的消息發送到應用法度的消息隊列。每個應用法度都有一段響應的法度代碼來檢索、分發這些消息到對應的窗體,然后由窗體的處理懲罰函數來處理懲罰。


    二、C#中的消息的封裝


    C#對消息從頭進行了面對對象的封裝,在C#中消息被封裝成了事務。
    System.Windows.Forms.Application類具有效于啟動和停止應用法度和線程以及處理懲罰Windows消息的辦法。
    調用Run以啟動當火線程上的應用法度消息輪回,并可以選擇使其窗體可見。
    調用Exit或ExitThread來停止消息輪回。
    C#頂用Application類來處理懲罰消息的接管和發送的。消息的輪回是由它負責的。
    從本質上來講,每個窗體一般都對應一個窗體過程處理懲罰函數。那么,C#的一個Form實例(相當于一個窗體)收到消息后是如何處理懲罰消息的?其實,這個題目的解析也就是顯現了C#的消息封裝道理。


    三、C#中消息的工作流程:


    1、 Application類有一個AddMessageFilter的靜態辦法,經由過程它我們可以添加消息篩選器,以便在向目標傳遞Windows消息時,檢視這些消息。
    應用消息篩選器來防止激發特定事務,或在將某事務傳遞給事務處理懲罰法度之前應用消息篩選器對其履行特別操縱。


    我們必須供給IMessageFilter接口的一個實現,然后才可以應用消息篩選器。


    2、 C#中的消息被Application類從應用法度消息隊列中取出,若是有消息篩選器,先履行消息篩選, 然后分發到消息對應的窗體。


    1)窗體對象的第一個響應函數是窗口過程函數,即對象中的protected override void WndProc(ref System.Windows.Forms.Message e)辦法。


    2)再按照消息的類型調用默認的消息響應函數(如OnMouseDown)


    3)再按照用戶自定義的事務處理懲罰函數,按訂閱次序分別履行(如Form1_MouseDown1)。



    四、示例:



    namespace WindowsApplication27
    {
    partial class Form1
    {
    ///
    /// 必須的設計器變量。
    ///
    private System.ComponentModel.IContainer components = null;


    ///
    /// 清理所有正在應用的資料。
    ///
    /// 若是應開釋托管資料,為 true;不然為 false。
    protected override void Dispose(bool disposing)
    {
    if (disposing && (components != null))
    {
    components.Dispose();
    }
    base.Dispose(disposing);
    }


    #region Windows 窗體設計器生成的代碼


    ///
    /// 設計器支撐所需的辦法 - 不要
    /// 應用代碼編輯器批改此辦法的內容。
    ///
    private void InitializeComponent()
    {
    this.SuspendLayout();
    //
    // Form1
    //
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(292, 266);
    this.Name = "Form1";
    this.Text = "Form1";


    //這里訂閱了事務
    this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
    this.ResumeLayout(false);


    }


    #endregion


    }
    }





    using System;


    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;


    namespace WindowsApplication27
    {


    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();


    Application.AddMessageFilter((new msgFilter()));
    }


    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
    MessageBox.Show("3");
    }
    protected override void OnMouseDown(MouseEventArgs e)
    {
    MessageBox.Show("2");
    base.OnMouseDown(e);
    }



    protected override void WndProc(ref Message m)
    {
    //MouseDown Msg Id
    if (m.Msg==0 x0201)
    MessageBox.Show("1");
    base.WndProc(ref m);
    }


    }


    public class msgFilter : IMessageFilter
    {
    public bool PreFilterMessage(ref Message m)
    {


    if (m.Msg == 0 x0201)
    MessageBox.Show("0");
    return false;
    }
    }
    static class Program
    {
    ///
    /// 應用法度的主進口點。
    ///
    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    }
    }
    }


    轉到頁頭】【返回
  • <button id="ywcoc"><input id="ywcoc"></input></button>
  • <object id="ywcoc"><blockquote id="ywcoc"></blockquote></object>
    <table id="ywcoc"></table>
  • 精品一区二区国产在线观看_高h猛烈失禁潮喷a片在线播放_青青国产成人久久111网站_日本免费a片一区二区三区四区