Tag: pinvoke

在Win 7上更改程序的音量

我想更改程序的音量(而不是主音量)。 我现在有以下代码: DllImport(“winmm.dll”)] public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume); [DllImport(“winmm.dll”)] public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume); private void volumeBar_Scroll(object sender, EventArgs e) { // Calculate the volume that’s being set int NewVolume = ((ushort.MaxValue / 10) * volumeBar.Value); // Set the same volume for both the left and the right […]

用C#设置风扇速度

我知道之前有人问过,但我似乎无法让它发挥作用。 我打电话给以下人: using System.Management; using System.Management.Instrumentation; using System.Runtime.InteropServices; 我试过这个(我知道它很可悲,但它是我发现的最好的): [DllImport(“Cimwin32.dll”)] private void button1_Click(object sender, EventArgs e) { uint32 SetSpeed( //??? [in] uint64 300 ); } 如何通过c#设置计算机的风扇速度?

使用PInvoke返回从C到C#的点(x,y,z)列表

我需要使用PInvoke将我从C dll中获得的点列表返回给C#应用程序。 这些是3维[x,y,z]中的点。 点数因型号而异。 在C i中处理这个结构的链接列表。 但我不知道如何将其传递给C#。 我看到它的方式,我必须返回一个灵活的二维数组,可能在一个结构中。 有关如何做到这一点的任何建议? 关于如何在C中返回它以及如何在C#中访问它的想法都受到高度赞赏。

SetProcessDpiAwareness没有效果

我一直在尝试在ClickOnce应用程序上禁用DPI感知。 我很快发现,无法在清单中指定它,因为ClickOnce不支持清单文件中的asm.v3。 我找到的下一个选项是调用新的Windows函数SetProcessDpiAwareness 。 根据这个教程, 在创建应用程序窗口之前调用SetProcessDpiAwareness。 这个教程, 您必须在任何Win32API调用之前调用SetProcessDpiAwareness 你必须尽早调用这个函数。 所以,为了测试,我创建了一个完全空白的WPF应用程序,并将其作为我的整个App类: [DllImport(“SHCore.dll”, SetLastError = true)] private static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness); [DllImport(“SHCore.dll”, SetLastError = true)] private static extern void GetProcessDpiAwareness(IntPtr hprocess, out PROCESS_DPI_AWARENESS awareness); private enum PROCESS_DPI_AWARENESS { Process_DPI_Unaware = 0, Process_System_DPI_Aware = 1, Process_Per_Monitor_DPI_Aware = 2 } static App() { var result = SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_DPI_Unaware); var […]

pinvoke:如何释放malloc’d字符串?

在C dll中,我有这样的函数: char* GetSomeText(char* szInputText) { char* ptrReturnValue = (char*) malloc(strlen(szInputText) * 1000); // Actually done after parsemarkup with the proper length init_parser(); // Allocates an internal processing buffer for ParseMarkup result, which I need to copy sprintf(ptrReturnValue, “%s”, ParseMarkup(szInputText) ); terminate_parser(); // Frees the internal processing buffer return ptrReturnValue; } 我想使用P / invoke从C#中调用它。 [DllImport(“MyDll.dll”)] […]

将.NET P / Invoke代码组织到Win32 API的最佳实践

我在.NET中重构了一个庞大而复杂的代码库,它大量使用P / Invoke到Win32 API。 项目的结构并不是最好的,我发现DllImport语句遍布整个地方,经常为同一个函数复制,并且还以各种方式声明: import指令和方法有时被声明为public,有时是private,有时是静态的,有时也是实例方法。 我担心重构可能会产生意想不到的后果,但这可能是不可避免的。 是否有可以帮助我的最佳实践记录? 我的目标是组织一个静态/共享的Win32 P / Invoke API类,它在一个文件中列出所有这些方法和相关的常量… 编辑对user32 DLL有超过70个导入。 (代码库由20多个项目组成,包含大量的窗口消息传递和跨线程调用。如果有所不同,它也是从VB6升级的VB.NET项目。)

如何在C#中找到Mutex?

如何从C#中的互斥锁中找到获取互斥锁的? 当mutex.WaitOne(timeout)超时时,它返回false 。 但是,如何从互斥锁手柄中找到它? (也许使用p / invoke。) 更新 : public class InterProcessLock : IDisposable { readonly Mutex mutex; public bool IsAcquired { get; private set; } public InterProcessLock(string name, TimeSpan timeout) { bool created; var security = new MutexSecurity(); security.AddAccessRule(new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.Synchronize | MutexRights.Modify, AccessControlType.Allow)); mutex = new Mutex(false, name, out created, security); […]

如何使用视觉样式绘制任务栏按钮?

我创建了一个DeskBand工具栏,我想在工具栏上显示一个按钮,该按钮具有样式视觉样式作为任务栏按钮。 在.NET中,您可以使用VisualStyleRenderer呈现任务栏背景,但是可以使用方法呈现按钮。 是否有任何Win32 API可用于使用视觉样式绘制按钮而不是通过绘制路径或图像模拟按钮的外观?

切换增强指针精度

我们基本上是在创建一个控制面板小程序。 我们需要在鼠标属性中切换“增强指针精度”。 为此,我们需要使用SPI_GETMOUSE调用SystemParametersInfo 。 它有一个由3个元素组成的数组作为其第三个参数。 我是PInvoke的新手,我尝试了许多签名,但到目前为止还没有运气。 这是我为签名尝试的内容: [DllImport(“user32.dll”, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SystemParametersInfo(uint uiAction, uint uiParam, [MarshalAs(UnmanagedType.LPArray)] ref long[] vparam, SPIF fWinIni); static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref long[] vparam, SPIF fWinIni); 以上都没有为我工作,这是我得到的例外: System.AccessViolationException :尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 在搜索时我想出了这个在VB中。 解决方案:感谢GWLlosa的回答 ,我想出了解决方案: [DllImport(“user32.dll”, EntryPoint = “SystemParametersInfo”, SetLastError = true)] public static extern […]

如何通过CLSID在C#中实例化COM对象?

如果我的术语已经关闭,请原谅我,因为这对我来说是一个有点未知的领域。 我有一个程序需要创建FolderShortcut 。 Microsoft有关于如何使用C ++创建它的文档 ,我正在尝试将方向转换为C#。 指令声明需要使用CLSID_FolderShortcut作为参数调用CoCreateInstance函数,我推断它意味着它实例化COM对象。 该对象的CLSID是{0AFACED1-E828-11D1-9187-B532F1E9575D} 。 我尝试从COM选项卡添加对Shell32.dll的引用,但是FolderShortcut对象没有出现在Intellisense中(也许它不在typelib中?)。 我还想过做一个DLLImport ,但是,当然,这只能让我访问函数,而不是对象。 要在.Net中访问此对象,我需要做什么?