Articles of pinvoke

在.NET应用程序中禁用可访问性快捷方式?

此MSDN文章 – http://msdn.microsoft.com/en-us/library/bb219746(VS.85).aspx#Disabling_Accessibility_Shortcut_Keys – 为C ++程序员提供有关如何暂时禁用可访问性的Windows快捷方式的信息(例如按住Shift 8秒,或者连续按下Shift 5次以上)。 当然,在C#中有一些简单的方法可以做到这一点,但我找不到任何资源。 我在非全屏应用程序中使用DirectInput。 我想要做的就是没有恼人的popup窗口出现; 尽pipe如此,为了防止应用程序以非优雅的方式closures(我不希望在这种情况下永久性地改变用户的设置),我宁愿select一些不需要使用Windows设置的东西, 。 有什么想法吗?

从c#调用UNIX和Linux共享对象文件.so

有没有办法用C编写的共享对象文件,并build立在Unix上,从C#P / Invoke调用? 或者我需要使用Java或类似的东西?

通过引用传递的参数使用P / Invoke返回垃圾

我在Linux上使用Mono / C#并且有以下C#代码: [DllImport("libaiousb")] extern static ResultCode QueryDeviceInfo(uint deviceIndex, ref uint PID, ref uint nameSize, StringBuilder name, ref uint DIOBytes, ref uint counters); 我称之为定义如下的Linux共享库调用: unsigned long QueryDeviceInfo( unsigned long DeviceIndex , unsigned long *pPID , unsigned long *pNameSize , char *pName , unsigned long *pDIOBytes , unsigned long *pCounters ) 在调用Linux函数之前,我已将参数设置为已知值。 我也在Linux函数的开头放了一个printf,所有的参数都按照预期打印值。 所以参数似乎从C#传递到Linux正常。 返回值也不错。 但是,通过引用传递的所有其他参数都会返回垃圾。 […]

P /调用ioctl系统调用

我正在开发一个需要与Video4Linux抽象交互的应用程序。 该应用程序是用C#开发的,使用单声道框架。 我面临的问题是,我不能P /调用ioctl系统调用。 或者,更确切地说,我可以P /调用它,但它崩溃严重。 外部声明如下: [DllImport("libc", EntryPoint = "ioctl", SetLastError = true)] private extern static int KernelIoCtrl(int fd, int request, IntPtr data); 到现在为止还挺好。 使用KernelIoCtrl的实际例程如下: protected virtual int Control(IoSpecification request, object data) { GCHandle dataHandle; IntPtr dataPointer = IntPtr.Zero; try { // Pin I/O control data if (data != null) { dataHandle = GCHandle.Alloc(data, […]

为GetLogicalProcessorInformation函数调用PInvoke

我想调用通过C#/ PInvoke GetLogicalProcessorInformation函数,但我坚持与SYSTEM_LOGICAL_PROCESSOR_INFORMATION结构和CACHE_DESCRIPTOR结构。 我应该如何定义这些结构的正确用法? 主要问题: 1. SYSTEM_LOGICAL_PROCESSOR_INFORMATION在它的定义中有union 2. SYSTEM_LOGICAL_PROCESSOR_INFORMATION在其定义中有ULONGLONG CACHE_DESCRIPTOR在其定义中有WORD和DWORD 。 你能帮助我这些结构吗?

使用C#获取连接到命名pipe道服务器的客户端的进程ID

我不确定我是否没有看到它,或者是什么? 我需要知道从NamedPipeServerStream实例通过命名pipe道连接到我的服务器的客户端的进程ID。 这样可能吗? 同时我想出了这个function: [DllImport("kernel32.dll", SetLastError = true)] internal static extern bool GetNamedPipeClientProcessId(IntPtr Pipe, out UInt32 ClientProcessId); public static UInt32 getNamedPipeClientProcID(NamedPipeServerStream pipeServer) { //RETURN: // = Client process ID that connected via the named pipe to this server, or // = 0 if error UInt32 nProcID = 0; try { IntPtr hPipe = pipeServer.SafePipeHandle.DangerousGetHandle(); GetNamedPipeClientProcessId(hPipe, […]

查找包含特定文本的窗口

我试图find一个特定的窗口是否已被一个进程打开。 该过程会产生多个窗口,我需要检查所有的窗口。 我不难find这个过程 foreach (Process p in Process.GetProcesses()) { if (p.MainModule.FileName.ToLower().EndsWith("foo.exe")) FindChildWindowWithText(p); //do work 问题是接下来要做什么。 我不能使用Process的MainWindowText ,因为它随着激活的窗口而改变。 然后我试图使用Windows函数EnumChildWindows和GetWindowText ,但我不知道如果我传递一个正确的句柄EnumChildWindows。 EnumChildWindows在通过MainWindowHandle时按预期工作,但当然MainWindowHandle随活动窗口而变化。 所以我通过Process.Handle ,但是当切换应用程序的窗口时,我得到了不同的句柄和不同的结果。 (据我所知,EnumChildWindows不仅返回句柄,而且还包括.NET中的控件 ,如果我能得到窗口的标题也不会有问题) 也许我正在做这个错误的方式,我需要一个不同的方法 – 我的问题再一次find一个与特定的正则expression式匹配的文本的窗口。 所以我可能需要一个枚举所有窗口的function,在任务栏中可见等等。 谢谢

正确使用P / Invoke

我需要从C#调用外部DLL。 这是标题定义: enum WatchMode { WATCH_MODE_SYSTEM = 0, WATCH_MODE_APPLICATION = 1 }; LONG ADS_API WDT_GetMode ( LONG i_hHandle, WatchMode * o_pWatchMode ); 我在C#中添加了enum和call: public enum WatchMode { WATCH_MODE_SYSTEM = 0, WATCH_MODE_APPLICATION = 1 } [DllImport("AdsWatchdog.dll")] internal static extern long WDT_GetMode(long hHandle, ref WatchMode watchmode); 这会生成一个AccessViolationException。 我知道DLL是'工作',因为我还添加了一个调用GetHandle返回hHandle提到的hHandle 。 我试图改变参数为int ( ref int watchmode ),但得到相同的错误。 没有人知道我可以如何PInvoke上述电话?

如何使用SPI_SETWORKAREA标志调整桌面工作区的大小?

我一直在尝试调整桌面工作区域(窗口最大化的区域)。 我find了所需的API,但似乎无法调整工作区域的大小。 它什么也没有做。 我使用Windows 7旗舰版64位,所以我也尝试编译它在x64'模式',仍然没有运气。 有人能给我一个正确的方向? 这是我到目前为止: [DllImport("user32.dll", EntryPoint = "SystemParametersInfoA")] private static extern Int32 SystemParametersInfo(Int32 uAction, Int32 uParam, IntPtr lpvParam, Int32 fuWinIni); private const Int32 SPIF_SENDWININICHANGE = 2; private const Int32 SPIF_UPDATEINIFILE = 1; private const Int32 SPIF_change = SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE; private const Int32 SPI_SETWORKAREA = 47; private const Int32 SPI_GETWORKAREA = 48; […]

对来自PInvoked OpenFileDialog(GetOpenFileName)的非托pipe数组的string进行编组

OpenFileDialog返回一个指向内存的指针,该指针包含一系列以空字符结尾的string,接着是最后一个空指示数组的末尾。 这就是我从非托pipe指针返回C#string的方式,但是我确定必须有一个更安全,更优雅的方式。 IntPtr unmanagedPtr = // start of the array … int offset = 0; while (true) { IntPtr ptr = new IntPtr( unmanagedPtr.ToInt32() + offset ); string name = Marshal.PtrToStringAuto(ptr); if(string.IsNullOrEmpty(name)) break; // Hack! (assumes 2 bytes per string character + terminal null) offset += name.Length * 2 + 2; }