C# 如何将COLORREF中的所有数据返回给C中的调用者#

C# 如何将COLORREF中的所有数据返回给C中的调用者#,c#,c++,.net,C#,C++,.net,我正在尝试编写一个.dll,然后用C#调用这个.dll。我跟随这篇文章: 现在,我的问题是如何将COLORREF中的所有数据返回给C#中的调用者,然后能够区分这些值 这是.dll中的源代码: #pragma一次 #包括 外部“C” { __declspec(dllexport)COLORREF\uU stdcall getColor(int X,int Y){ HDC _HDC=GetDC(NULL); COLORREF_结果=0; 如果(_hdc) { _结果=GetPixel(_hdc,X

我正在尝试编写一个
.dll
,然后用C#调用这个
.dll
。我跟随这篇文章:

现在,我的问题是如何将
COLORREF
中的所有数据返回给C#中的调用者,然后能够区分这些值

这是
.dll
中的源代码:

#pragma一次
#包括
外部“C”
{
__declspec(dllexport)COLORREF\uU stdcall getColor(int X,int Y){
HDC _HDC=GetDC(NULL);
COLORREF_结果=0;
如果(_hdc)
{
_结果=GetPixel(_hdc,X,Y);
/*int _red=GetRValue(_result);
int _green=GetGValue(_result);
int_blue=GetBValue(_结果)*/
ReleaseDC(空,_hdc);
返回结果;
}
返回结果;
}
}
以下是C#来源的一些部分:

public分部类主窗口:表单
{
[DllImport(@“test.dll”,EntryPoint=“getColor”,CallingConvention=CallingConvention.StdCall)]
私有静态外部UInt32 getColor(int X,int Y);
私有void ColB_单击(对象发送方,事件参数e)
{
UInt32结果=getColor(500500);

MessageBox.Show(Convert.ToString(result));/
COLORREF
只是
DWORD
的别名,它在C#中确实是
UInt32
。因此,只要在C#中调用
getColor()
函数,您的代码看起来就不错了。不过,我建议让函数返回
CLR\u无效(
0xFFFFFFFF
)失败时,而不是返回0(黑色),特别是因为
GetPixel()
在失败时返回
CLR\u INVALID
,例如:

COLORREF\uu stdcall getColor(int X,int Y){
COLORREF\u结果=CLR\u无效;
HDC _HDC=GetDC(NULL);
如果(_hdc)
{
_结果=GetPixel(_hdc,X,Y);
ReleaseDC(空,_hdc);
}
返回结果;
}
也就是说,控件的属性需要a,而不是
UInt32
。可以使用以下方法之一从
COLORREF
获取
Color
,例如:

UInt32结果=getColor(500500);
如果(结果!=0xFFFFFFFF){
int红色=(int)(字节)(结果&0xFF);
绿色整数=(整数)(字节)((结果>>8)和0xFF);
蓝色整数=(整数)(字节)((结果>>16)和0xFF);
ColB.BackColor=Color.FromArgb(红色、绿色、蓝色);
}
或者,方法:

UInt32结果=getColor(500500);
如果(结果!=0xFFFFFFFF){
ColB.BackColor=ColorTranslator.FromWin32((int)结果);
}