我对 winsock 的级别有多低有点困惑?我想在 Windows 上编写一个非常基本的客户端-服务器程序。我真的不想使用臃肿的 TCP 甚至 UDP,只是一些非常基本和低延迟的东西。winsock 是理想的选择吗?或者winsock与windows网络功能相同,只是全部打包(并且可能更慢)?在本机 Windows 网络功能上使用 PInvoke 会更好吗?
假设我有一个带有原型的 C++ 函数
int someFunction(const float ** raws)
Run Code Online (Sandbox Code Playgroud)
如何使用float[][]C# 中的参数调用此函数?可能不使用不安全代码。
我想要获取所有可以截图的窗口,应用程序窗口。我正在尝试使用EnumWindows.
public delegate bool CallBackPtr(IntPtr hwnd, int lParam);
[DllImport("user32.dll")]
private static extern int EnumWindows(CallBackPtr callPtr, int lPar);
public static List<IntPtr> EnumWindows()
{
var result = new List<IntPtr>();
EnumWindows(new User32.CallBackPtr((hwnd, lParam) =>
{
result.Add(hwnd);
return true;
}), 0);
return result;
}
Run Code Online (Sandbox Code Playgroud)
然而,这返回的 Windows 数量超出了我的预期,例如:



我只想获取 Windows,例如 Visual Studio、Skype、Explorer、Chrome...
我应该使用其他方法吗?或者我如何检查它是否是我想要抓取的窗口?
尝试了很多例子但没有成功我有一个用Delphi编写的DLL,它导出一个返回数组的函数,然后导入到C#应用程序中。A 成功处理一个变量:
德尔福
function GetArrayData(var testArray : integer): WordBool; stdcall; export;
begin
testArray := 1;
Result := True;
end;
Run Code Online (Sandbox Code Playgroud)
C#
[DllImport("some.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
static extern bool GetArrayData([Out] out IntPtr IntegerArrayReceiver);
private void GetButton_Click(object sender, EventArgs e)
{
unsafe
{
IntPtr IntegerArrayReceiver = IntPtr.Zero;
GetArrayData(out IntegerArrayReceiver);
textBoxData.Text = IntegerArrayReceiver.ToString();
}
Run Code Online (Sandbox Code Playgroud)
请有人将这段代码转换为与数组一起使用。意思是从 Delphi 导出一个数组并导入到 C# 数组。我有 Delphi 和 C# 代码的源代码。
我使用以下方法获得了一个外部 DLL (c++):
void _stdcall Set_Config(char* config)
Run Code Online (Sandbox Code Playgroud)
我使用以下 c# 代码来调用该方法:
[DllImport(DllName,CharSet=CharSet.Auto)]
public static extern void Set_Config(String config);
Run Code Online (Sandbox Code Playgroud)
但是当我执行我的 c# 代码时,我得到一个访问违规异常或一个 System.Runtime.InteropServices.SEHException。(我的 dll 是 32 位的,我的 c# 编译器编译为 32 位)
我也尝试用 Stringbuilder 替换 String config,但结果相同。
有人可以帮助我解决这个问题或提供一些示例代码,我必须如何调用 C++ 方法?
好的,我有一个 DLL 函数声明为:
[DllImport(mDllName, EntryPoint = "SetParam")]
public static extern bool setParam(string param_name, ref IntPtr param_value);
Run Code Online (Sandbox Code Playgroud)
这个函数需要许多不同的参数,即在 C++ 中这就是你将如何使用它。
int i=2;
setParam("width", &i);
float k=2.5f;
setParam("factor", &f);
Run Code Online (Sandbox Code Playgroud)
所以我试图声明一个 C# 函数来调用这个 DLL api,我有一个用于指向整数大小写的指针:
public static void setWidth(int width)
{
IntPtr w = new IntPtr(width);
setParam("width", ref w);
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何做第二个,我将一个指针作为 IntPtr 传递给浮点数。有任何想法吗?
public static void setFactor(float f)
{
IntPtr w = new IntPtr(f); // WHAT GOES HERE??
setParam("factor", ref w);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用GetWindowRect()(和GetGUIThreadInfo())获得插入符号位置:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Runtime.InteropServices;
namespace WpfApplication1
{
public class CaretInfo
{
public double Width { get; private set; }
public double Height { get; private set; }
public double Left { get; private set; }
public double Top { get; private set; }
public CaretInfo(double width, double height, double left, double top)
{
Width = width;
Height = height;
Left = left;
Top = top;
}
} …Run Code Online (Sandbox Code Playgroud) 我从未在 C# 中创建过 P/Invoke 包装器方法,因为有一种方法可以使用 .NET Framework 类以“托管方式”来实现。
但是,我需要调用 Win32 API 函数,我发现它并不像我想象的那么容易。
IsWowProcess2 中的函数以及从 C++ 调用它的代码在此处说明。
我创建了一个愚蠢的程序来测试它,但当然,它不起作用:
class Program
{
static void Main(string[] args)
{
var result = IsWowProcess2();
}
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = false, PreserveSig = true)]
private static extern MyStruct IsWowProcess2();
}
internal class MyStruct
{
public ushort One { get; set; }
public ushort Two { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
创建包装方法以及如何调用它的正确方法是什么?
我正在运行一个处理位图图像的应用程序。现在我正在寻找一种快速方法来交换“Format24bppRgb”位图图像的“红色”和“蓝色”值。在我的 C# 代码中,我的第一次尝试是使用不安全的代码片段:
var bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, bmp.PixelFormat);
unsafe
{
byte* array = (byte*)bmpData.Scan0.ToPointer();
byte temp;
for (int x = 0; x < bmp.Width * bmp.Height * 3; x = x + 3) {
temp = *(array + x + 2);
*(array + x + 2) = *(array + x);
*(array + x) = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
对于我使用的位图大小,这大约需要 50-70 毫秒。现在我尝试使用 pinvoke 调用在外部库(基于 C++)中完成这项工作:
[DllImport("ByteSwitch.dll")]
public static extern IntPtr ChangeRB(IntPtr data, int width, int height);
data …Run Code Online (Sandbox Code Playgroud) 我试图覆盖整个计算机的光标this.Cursor = Cursors.Pen; System.Windows.Input.Mouse.OverrideCursor = Cursors.Pen;
这适用于WPF"窗口",但不在其他任何地方.
什么.dll会让我这样做?