对于标准的win32控件,c#如何处理clr中的事件,比如一个按钮:

示例:(c#)

    private void Form1_Load(object sender, EventArgs e)
    {
        button1.Click += (_, __) => { MessageBox.Show("You clicked me !"); };
    }

它是否像c ++一样,在主消息循环中?`

例:

while (GetMessage(&msg, NULL, 0, 0))
{
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{

case WM_COMMAND:


    if(hWnd>0 && hWnd==buttonhwnd) //Button click
    {
        callback_button();
    }

default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

我的意思是c#中的所有标准控件都会将每个信号发送到一个类似的循环 - 然后再回到源代码注册的回调中吗? 像我的lambda例子?

===============>>#1 票数:3 已采纳

当然,基本机制是一样的。 但是,Winforms(以及某种程度上的WPF)显着改变了消息路由。 在Windows中,子控件将通知发送到其父窗口。 Winforms管道通过窗口子类和消息反射的混合来改变,使代码在控件本身中运行。 例如,一个按钮的OnClick()方法。

从那里,通过事件订阅,任何其他类都可以接收Click事件回调。 例如,一个常见的模式是不要让放置按钮的面板处理回调而是处理上层表单。 这比原生Windows方式具有很大的灵活性。

===============>>#2 票数:1

那是另一种方式。

有一个消息循环,一个用于您的应用程序。 我怀疑它是在Application类的某个地方。 循环将所有传入消息调度到构建在Control类中某处的处理程序。

然后,内置处理程序检查控件实例是否具有附加到事件的委托,如果是这样,则调用该事件。

  ask by Niklas translate from so

未解决问题?本站智能推荐:

8回复

自动创建空的C#事件处理程序

无法在C#中触发没有附加处理程序的事件。 因此,在每次调用之前,有必要检查事件是否为null。 我想保持我的代码尽可能干净,并摆脱这些空检查。 我认为这不会对性能产生太大影响,至少在我看来不会如此。 现在,我通过为每个事件手动添加一个空的内联处理程序来解决此问题。 这很容易
3回复

.NET如何有效地监听引发的事件?

它是否使用某种轮询事件队列的事件线程? 此外,根据事件的类型,技术会有所不同吗? 某些事件由程序本身引发,如按钮单击,而其他事件则在外部引发,如FileSystemWatcher读取的FileCreated事件。 引擎盖下这些事件的处理方式有何不同?
2回复

.NET事件特殊方法(添加/删除/提升/其他)

我想知道EventInfo.GetRaiseMethod和EventInfo.GetOtherMethods方法。 显然,CLR支持4种与事件相关的方法:添加,删除,提升和“其他”。 但是在C#中创建的事件只有添加和删除 ...我假设在VB中使用了raise ,因为你必须在声明自定义事件时指
2回复

如果我将对事件对象的引用复制到另一个对象,然后再更改事件对象该怎么办?

我正在读一本关于C#和CLR的书,无法理解一件事。 文字如下: 为了解决这种竞争状况,许多开发人员如下编写OnNewMail方法: 这里的想法是将对NewMail的引用复制到一个临时变量temp中,该临时变量引用执行分配时的委托链。 现在,此方法比较temp和null
3回复

每次调用新方法时触发事件

我正在为一个c#应用程序创建一个记录器 ,它需要记录每个方法被调用每个方法的执行时间的时间。 我可以通过在每个方法的开头调用我自己的EventLogger.LogMethodCall方法来做到这一点,但我想知道是否有一种方法可以在每次调用新方法时使CLR触发一个事件,所以我不必手动叫我的方
1回复

在C#中使用C CLR :: Class库

我正在尝试让一些C ++代码在C#下工作。 我一直在尝试在线遍历所有地方的教程,而没有运气编译或执行代码。 我编写了一个基本的C ++类,该类可以编译为.dll,还可以编译为C#控制台应用程序。 -我已将平台工具集更改为C ++ dll上的v100-我在C#应用程序中添加了对该dll的
1回复

C#C ++ / CLR处理ref参数和字符串指针

我正在使用一个C ++ / CLR DLL到我的C#应用​​程序中,并努力将byRef参数传递给本机方法,因为本机代码带有“&”,但是C#提示我需要删除“ ref”(或“ out”)。 “)关键字。 此外,参数在我的C#中转换为“ ”,并且例如的字符串无法接受该类型,因此我收到了从“字符串”到
1回复

C ++ / CLI clr中的包装C ++:对于C#COM Interop是安全的

有什么方法可以使包装器clr:safe不受管理的C ++项目吗? 我的小故事就是这样开始的 “男孩,您必须执行一个项目'C#COM Interop',但是该项目必须使用'C ++库',并且必须仅产生'一个'(dll COM)。” 好的,经过几天的搜索,我意识到可以通过两种方式使用C
1回复

使用C ++触发事件并在C#中处理它们

我有一台带有一些数字I / O引脚的工业计算机。 制造商提供了一些C ++库和示例来处理引脚状态更改。 我需要将这些事件集成到C#应用程序中。 AFAIK执行此操作的最简单方法是: 为从DIO引脚发出中断时触发事件的制造商库创建托管C ++ / CLI包装器。 引用包
1回复

在C#上使用非clr dll

我正在使用许可库(c ++ dll)开发c#应用程序。 我没有该库的任何代码,也不是clr。 但是我可以通过使用pInvoke在c#上导入其方法,如下所示。 它在调试模式下完美运行。 但这是问题。 当我制作Visual Studio Installer项目时,我无