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#中修复该行?
ProgressBarColor
是Enum
,不能隐式计算为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
。