【问题标题】:How to use SendMessage from F#?如何使用 F# 中的 SendMessage?
【发布时间】:2011-12-26 13:00:35
【问题描述】:

我想在我使用 F# 编写的代码中使用代码 here 来暂停富文本框的屏幕刷新。我不知道如何使用 SendMessage (或 WM_SETREDRAW 或 EM_GETEVENTMASK )。如何在 F# 中声明和使用相关函数?

代码:

private void StopRepaint()
{
    // Stop redrawing:
    SendMessage(this.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
    // Stop sending of events:
    eventMask = SendMessage(this.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero);
}

【问题讨论】:

    标签: .net f# sendmessage


    【解决方案1】:

    Msdn documents how to declare external functions in F#.

    你的函数看起来像:

    open System
    open System.Runtime.InteropServices
    
    module InteropWithNative =
        [<DllImport(@"User32")>]
        extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam)
    

    【讨论】:

    • 足以让我弄清楚其余部分。谢谢!
    • Msg 应该是intuint32,而不是IntPtr——正如你所拥有的那样,x64 平台上会出现堆栈不平衡。 (此外,在 F# 中使用 nativeint 比使用 IntPtr 更惯用,但这与技术无关。)
    • 修复了 Msg 参数类型。我认为使用 IntPtr 或 nativeint 都很好,我不认为其中一个比另一个更惯用。
    • @Robert :嗯,一个是始终在范围内的类型别名(除非有阴影),而另一个需要open;有人会同意,出于同样的原因,在 C# 中使用 intstring 是惯用的,而不是使用 Int32String,不是吗?无论如何,就像我说的那样,这没有技术影响,所以为您的编辑 +1。 :-]
    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2017-05-12
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多