Tag: pinvoke

在窗口标题中更改光标

我有一个WinForm,现在我需要在窗口标题部分更改光标。 我有一些代码工作,它有两个问题: 它还会在边缘处更改光标(应显示正常的resize光标)。 我发现我需要这样的WM_NCHITTEST和HTTOP ,但我该如何组合呢? 移动鼠标时有一些闪烁。 我也尝试将代码放在base.WndProc(ref m); 。 这是我已有的代码: if ((m.Msg == Win32.WM.NCMOUSEMOVE || m.Msg == Win32.WM.NCLBUTTONDOWN || m.Msg == Win32.WM.NCLBUTTONUP || m.Msg == Win32.WM.NCRBUTTONDOWN || m.Msg == Win32.WM.NCRBUTTONUP) ) { if (m.WParam.ToInt32() != Win32.HT.TOP && m.WParam.ToInt32() != Win32.HT.RIGHT && m.WParam.ToInt32() != Win32.HT.BOTTOM && m.WParam.ToInt32() != Win32.HT.LEFT) { Cursor = Cursors.Hand; } } 编辑: […]

如何在从C到C#的结构中获得非托管可变长度C数组?

如何返回MIB_IPFORWARDROW数组? struct MIB_IPFORWARDTABLE { public uint Size; [MarshalAs(/* what goes here? */)] public IPFORWARDROW[] Table; }; [DllImport(“iphlpapi”, CharSet = CharSet.Auto)] private static extern int GetIpForwardTable( IntPtr /* MIB_IPFORWARDTABLE* */ pIpForwardTable, ref uint /* ULONG* */ pdwSize, bool bOrder); public static MIB_IPFORWARDROW[] Temp() { var fwdTable = IntPtr.Zero; uint size = 0; var result = GetIpForwardTable(fwdTable, […]

如何获取列表或枚举具有相同类和名称的非托管窗口的所有句柄

使用pinvoke我可以轻松找到具有特定类和名称的窗口的句柄: [DllImport(“user32.dll”)] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); IntPtr hWnd = FindWindow(“Foo Class”, “Foo Window”); 如果只有0或1个匹配的窗口,上面的代码是完美的。 但是,我正在使用的非托管应用程序跨越多个窗口。 多次调用FindWindow每次都返回相同的窗口句柄。 我需要做什么才能获得具有特定类和名称的所有窗口。 我也会接受替代解决方案同一目标的答案。 (我想也许可以通过找到应用程序的进程ID然后获取所有顶级窗口,并筛选所需的窗口来完成)。

确定用户是否在本地管理员组中

我的问题 我正在使用PInvoked Windows API函数来validation用户是否属于本地管理员组。 我正在使用GetCurrentProcess , OpenProcessToken , GetTokenInformation和LookupAccountSid来validation用户是否是本地管理员。 GetTokenInformation返回一个TOKEN_GROUPS结构数组的SID_AND_ATTRIBUTES结构。 我遍历集合并比较LookupAccountSid返回的用户名。 我的问题是,在本地(或更普遍地在我们的内部域),这可以按预期工作。 内置\ Administrators位于当前进程令牌的组成员身份中,我的方法返回true。 在另一个开发人员的另一个域上,该函数返回false。 LookupAccountSid在TOKEN_GROUPS结构的前2次迭代中正常运行,返回None和Everyone,然后TOKEN_GROUPS地抱怨“A参数不正确”。 什么会导致只有两组正常工作? TOKEN_GROUPS结构表示有14个组。 我假设它是无效的SID。 我所拥有的一切都是PInvoke 网站上的一个例子。 唯一的区别是,使用LookupAccountSid我已将Sid参数从byte[]更改为IntPtr因为SID_AND_ATTRIBUTES也是使用IntPtr定义的。 这是正确的,因为LookupAccountSid是用PSID定义的吗? LookupAccountSid PInvoke [DllImport(“advapi32.dll”, CharSet = CharSet.Auto, SetLastError = true)] static extern bool LookupAccountSid( string lpSystemName, IntPtr Sid, StringBuilder lpName, ref uint cchName, StringBuilder ReferencedDomainName, ref uint cchReferencedDomainName, out SID_NAME_USE peUse); 代码落空的地方 for […]

如何从进程开始捕获所有应用程序/窗口消息?

我试图弄清楚如何捕获进程/窗口的所有窗口消息,从它在c#中启动的时间开始。 这个过程不是我自己的,所以我需要使用某种钩子。 我的目标是从初始窗口创建之前实时捕获所有消息到应用程序退出并将所有消息输出到文本框或文件。 所以基本上从应用程序执行的那一刻起。 因为我想从它发布的时候捕获它,我可能没有窗口句柄,因为它们将无法处理。 所以我觉得它可能很棘手。 他们的应用程序是否可以用于参考? 我只想要来自应用程序的所有消息。

如何使用.NET P / Invoke CryptUIWizExport函数

任何人都可以将这两个cryptui.dll函数/结构翻译成C#.NET [dllimport]包装器吗? 我想P / Invoke CryptUIWizExport函数来显示Windows证书导出向导。 特别是,我需要将.NET X509Certificate作为参数传递给CryptUIWizExport函数。 非常感谢你的帮助! CryptUIWizExport函数 BOOL WINAPI CryptUIWizExport( __in DWORD dwFlags, __in HWND hwndParent, __in LPCWSTR pwszWizardTitle, __in PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, __in void *pvoid ); typedef struct _CRYPTUI_WIZ_EXPORT_INFO { DWORD dwSize; LPCWSTR pwszExportFileName; DWORD dwSubjectChoice; union { PCCERT_CONTEXT pCertContext; PCCTL_CONTEXT pCTLContext; PCCRL_CONTEXT pCRLContext; HCERTSTORE hCertStore; } ; DWORD cStores; HCERTSTORE *rghStores; […]

SECURITY_ATTRIBUTES何时发生变化?为什么?

我有一些代码使用P / Invoke来启动进程并捕获标准输出。 (我们为什么使用P / Invoke而不是System.Diagnostics.Process这样做的故事是漫长而复杂的;足以说它是一个要求。)它已经在重载下生产了近一年,并且测试运动它一直都过去了。 今天早上虽然我进行了测试,但他们失败了。 我不能确定我上次在今天早上(2014年5月15日)之前进行的测试,但我相信这是2014年4月24日。 测试通过了,但今天早上失败了。 我收到了“PInvokeStackImbalance”错误消息,所以我做了一些研究,最终意识到extern方法使用的其中一个结构的签名(在这个例子中为CreatePipe )是不正确的。 我改变了,测试又开始了。 我很高兴找到了解决方案,但我很关心部署。 为什么结构的签名会发生变化? 我没有升级我的操作系统或任何东西 – 我在4/24运行Windows 7 x64,我现在仍在运行它。 (部署环境是Windows Server 2012.)从那时起,我已经安装(并卸载)了一些应用程序,但它们是轻量级的第三方工具,而不是Microsoft或系统组件。 我假设Windows Update修复程序是负责任的,但我无法弄清楚哪一个。 要清楚,在我自己的代码中,我改变的是: [StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES { public UInt32 nLength; public IntPtr lpSecurityDescriptor; public bool bInheritHandle; } 对此: [StructLayout(LayoutKind.Sequential)] internal class SECURITY_ATTRIBUTES { public int nLength = 12; public IntPtr lpSecurityDescriptor = […]

c#中的C ++非托管DLL

我被要求在我的项目中集成网络摄像头ZoneTrigger。 该站点提供的SDK也是C ++的样本。 我已经能够使用很少的function。 我被卡住的地方是一个函数,其中char *是传递的参数。 我做了很多挖掘,并且已经知道必须使用MarshalAs …… 我想从c ++代码导入的函数 //header file struct ZT_TRIG_STRUCT { int aSize; //STRUCT size int CameraIndex; int SpotIndex; int SpotType; char SpotName[32]; DWORD Dummy[16]; }; typedef int (WINAPI *f_ZT_EnumerateHotSpots)(int SpotIndex, char *Name, int *SpotType); /* You application can call this functions to retrieve information about spots by iterating the SpotIndex […]

P /从C到C#调用,不知道数组的大小

正确地知道我的代码我已经将结构声明为这样,修复了这个16,在编译时知道。 struct CONSOLE_SCREEN_BUFFER_INFOEX { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public int ColorTable[]; } 但我需要的是能够拥有这种结构: struct CONSOLE_SCREEN_BUFFER_INFOEX { int arraySize; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0)] public int ColorTable[]; } 从C函数响应中获取arraySize,初始化具有适当大小的ColorTable数组,将响应结果放入ColorTable。 不确定是否可能,现在就进行调查,并且非常欢迎任何评论。

SetTimeZoneInformation不会更新另一个.NET应用程序的DateTime.Now

以下是我更改TimeZoneInfo(App#1)的方法: private static void ChangeTimeZone(TimeZoneInfo tzi) { TIME_ZONE_INFORMATION actual = new TIME_ZONE_INFORMATION(); NativeMethods.GetTimeZoneInformation(out actual); if (tzi == null || actual.StandardName == tzi.StandardName) return; TIME_ZONE_INFORMATION newZone = (TIME_ZONE_INFORMATION)tzi; RunWin32Method(() => NativeMethods.SetTimeZoneInformation(ref newZone)); // Update .NET CultureInfo.CurrentCulture.ClearCachedData(); TimeZoneInfo.ClearCachedData(); // Notify all windows that we changed a Windows setting. // result is True IntPtr ptr; System.Diagnostics.Debug.WriteLine(NativeMethods.SendMessageTimeout(NativeMethods.HWND_BROADCAST, NativeMethods.WMI_SETTING_CHANGE, IntPtr.Zero, […]