C#”;发送消息”;代码错误

本文关键字:代码 错误 消息 | 更新日期: 2023-09-27 17:57:31

我需要将以下代码从VB.NET转换为C#:

Public Class Form1
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Enum ProgressBarColor
        Green = &H1
        Red = &H2
        Yellow = &H3
    End Enum
    Private Shared Sub ChangeProgBarColor(ByVal ProgressBar_Name As Windows.Forms.ProgressBar, ByVal ProgressBar_Color As ProgressBarColor)
        SendMessage(ProgressBar_Name.Handle, &H410, ProgressBar_Color, 0)
    End Sub
End Class

VB.NET代码源:终极编程教程

我使用developerFusion的在线代码转换器来转换代码,这是它生成的C#代码:

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class Form1
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
    public enum ProgressBarColor
    {
        Green = 0x1,
        Red = 0x2,
        Yellow = 0x3
    }
    private static void ChangeProgBarColor(System.Windows.Forms.ProgressBar ProgressBar_Name, ProgressBarColor ProgressBar_Color)
    {
        SendMessage(ProgressBar_Name.Handle, 0x410, ProgressBar_Color, 0);
    }
}

编辑:从DllImport中删除了"ExactSpelling=true",因为它会导致错误。

然而,由于以下行,自动转换的代码无法编译:

SendMessage(ProgressBar_Name.Handle, 0x410, ProgressBar_Color, 0);

C#编译器显示的错误为:

错误:"Jyrka98_Modpack_CS.Form1.SendMessage(System.IntPtr,int,int)"的最佳重载方法包含一些无效参数。

它还显示了这个错误:

参数3:无法从"Jyrka98_Modpack_CS.Form1.ProgressBarColor"转换为"int"

我不明白那些错误信息是什么意思。如何在C#中修复该行?

C#”;发送消息”;代码错误

ProgressBarColorEnum,不能隐式计算为int。您需要将该值强制转换为int

尝试执行以下操作:

SendMessage(ProgressBar_Name.Handle, 0x410, (int)ProgressBar_Color, 0); 

由于您没有显示ProgressBarColor是如何声明的,这有点像猜测,但由于VB能够自动将其转换为Integer,我认为它是一个枚举。VB.NET编译器会自动将枚举值转换为Integer,但C#编译器不会。在C#中,您需要显式地将值强制转换为int,如下所示:

SendMessage(ProgressBar_Name.Handle, 0x410, (int)ProgressBar_Color, 0);

根据PINVOKE.NET,SendMessage API调用的正确声明是:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

我建议使用这些参数类型,而不是像使用的代码转换器那样使用int