Tag: winapi

如何制作WinApi函数的返回值?

简单:如何明确封送WinAPi函数的结果? 我知道如何在C#中编组WinApi函数的参数但是我如何编组返回值呢? 或者我真的要整理它们吗? 我理解WinAPi只返回BOOL或所有类型的INT (句柄在非托管代码中也是int)。 // common signature [DllImport(“kernel32.dll”, SetLastError = true, CharSet = CharSet.Ansi)] static extern int GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename); // my prefered signature because easy to handle the result [DllImport(“kernel32.dll”, SetLastError = true, CharSet = CharSet.Ansi)] static extern FileAttributes GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename); 因为FileAttributes是枚举的,并且每个值都可以很容易地转换为int所以我确信这个符号是安全的。 但是我可以像参与参数一样编组这个签名中的结果吗? 我实际上只知道Marshal类和MarshalAs属性。

Windows 8上的文件历史记录

我有一个与使用C#获取/设置“文件历史记录”(Windows 8)设置相关的问题 Windows提供了一个API 文件历史记录API , “允许应用程序读取和修改文件历史记录配置” 是否有此API的C#版本? 它需要.NET 4.5吗? 有没有关于如何使用此API的代码示例?

当我用任务管理器杀死我的程序时,我收到了什么消息

所以我有一个C ++ DLL,我在我的c#应用程序中用于监视Windows消息。 我想知道是否发送了WM_CLOSE和WM_QUERYENDSESSION,因为我无法从C#应用程序中看到它。 如果我收到其中一条消息,我想用我的文件做一些清理,但问题是当我用TM杀死它时function不起作用。 它接缝我没有得到消息。 我认为问题是任务管理器向C#应用程序发送消息而不是c ++ dll。 一些代码: C ++: typedef void (*CLOSING_FUNCTION)(); CLOSING_FUNCTION myClosingFunction; typedef void (*SHUTDOWN_FUNCTION)(); SHUTDOWN_FUNCTION myShutdownFunction; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: return 0; case WM_CLOSE: myClosingFunction(); return 0; case WM_QUERYENDSESSION: myShutdownFunction(); return 1; case WM_DESTROY: myClosingFunction(); PostQuitMessage(0); return 0; […]

CopyFileEx包含多个文件,但只有一个副本对话框

为此,我搜索了网络和stackoverflow。 我想将多个文件中的多个文件复制到多个目的地。 我还没有打扰UnauthorizedAccessExceptions – 这些文件最有可能无法使用。 我可以从这里使用CopyFileEx-Wrapper复制1个文件。 但是:我想要出现标准的Windows复制文件对话框。 我想复制多个文件 – 而不仅仅是一个 – 例如传递源文件数组和目标文件数组。 有没有办法做到这一点? 更多:有没有办法将此排队作为一个任务而不是x分离的复制操作? 这样做的原因是我只想显示一个进度对话框 – 从复制所有文件的开始到结束。 我希望我的问题很清楚。 非常感谢大家提前。 divStar。

PCWSTR与LPWSTR

这是我的理解(如果我错了,请纠正我),它们之间的唯一区别是字符串是否可能被被调用函数修改。 ( PCWSTR , LPWSTR ) 我现在正试图将一个字符串从C#传递给一个期望PCWSTR的函数,但我能找到的只是[MarshalAs(UnmanagedType.LPWStr)] 。 我纠正那没关系吗? (是的,它有效 。但是,这并不能certificate它没问题。有些东西可以工作,但会导致内存泄漏等)

如何将多字符串转换为C#字符串集合?

多字符串(双重空格终止的空字符串字符串)在Windows API中很常见。 将从API返回的多字符串转换为C#字符串集合的好方法是什么,反之亦然? 我对正确处理字符编码特别感兴趣(稍后是Windows XP)。 以下方法似乎可以创建多字符串,但我没有解码多字符串的示例。 static string StringArrayToMultiString( ICollection stringArray ) { StringBuilder multiString = new StringBuilder(); if (stringArray != null) { foreach (string s in stringArray) { multiString.Append(s); multiString.Append(‘\0’); } } return multiString.ToString(); }

Win32Api USB SetupDiGetDeviceInterfaceDetail失败

我正在尝试连接USB GPS设备。 如果我通过CreateFile WinApi手动创建文件(使用设备管理器中指定的路径),我可以成功连接到设备。 但是,当我尝试通过枚举选择设备时,我失败了@ SetupDiGetDeviceInterfaceDetail调用。 我有正确的C代码,但我的C#转换似乎无法正常工作。 我尝试了很多变化,结果基本相同。 C代码有效 // Get enumerator handle for the specified ClassGuid HDEVINFO theDevInfo = SetupDiGetClassDevs((GUID*)&GUID_DEVINTERFACE_GRMNUSB, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); SP_DEVICE_INTERFACE_DATA theInterfaceData; theInterfaceData.cbSize = sizeof(theInterfaceData); // populate theInterfaceData which contains device class information if (!SetupDiEnumDeviceInterfaces(theDevInfo, NULL, (GUID*)&GUID_DEVINTERFACE_GRMNUSB, 0, &theInterfaceData) && GetLastError() == ERROR_NO_MORE_ITEMS) { gHandle = 0; return; } […]

如何从CreateProcessWithLogonW获取标准输出?

我使用的是http://www.pinvoke.net/default.aspx/advapi32.createprocesswithlogonw中的代码。 如何将标准输出的输出作为字符串? 就像在命令窗口中以交互方式运行它时出现的东西一样?

C#使用CredWrite访问C $

我正在尝试使用对该服务器没有权限的域帐户访问服务器的C $。 我需要以该服务器的本地登录的forms保存凭据,以使程序正常工作。 如何使用CredWrite保存这些凭据 我发现的Credential Manager类:(编辑:以下是正常运行的代码。) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; namespace Test_Manager { public class Win32CredMan { [DllImport(“Advapi32.dll”, EntryPoint = “CredReadW”, CharSet = CharSet.Unicode, SetLastError = true)] static extern bool CredRead(string target, CRED_TYPE type, int reservedFlag, out IntPtr CredentialPtr); [DllImport(“Advapi32.dll”, EntryPoint = “CredWriteW”, CharSet = CharSet.Unicode, SetLastError […]

如何挂钩应用程序?

我正试图在我的C#应用​​程序中挂钩创建一个窗口。 static IntPtr hhook = IntPtr.Zero; static NativeMethods.HookProc hhookProc; static void Main(string[] args) { // Dummy.exe is a form with a button that opens a MessageBox when clicking on it. Process dummy = Process.Start(@”Dummy.exe”); try { hhookProc = new NativeMethods.HookProc(Hook); IntPtr hwndMod = NativeMethods.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName); hhook = NativeMethods.SetWindowsHookEx(HookType.WH_CBT, hhookProc, hwndMod, (uint)AppDomain.GetCurrentThreadId()); Console.WriteLine(“hhook valid? {0}”, hhook != […]