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, […]

对来自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; }

从C#中修改任何窗口的不透明度

是否有可能修改从C#打开的所有窗口的不透明度。 我GOOGLE了最小化的窗口,我才知道它可能与pInvoke调用。 它甚至工作。 同样,有可能从C#中更改所有打开的窗口的不透明度? 另外,我不在MFC的东西。 还有没有什么工具可以知道在dll中暴露的apis列表?

C#如何获取Windows监视器名称

我试图做一个显示所有显示和监视器名称的函数。 但是第二次我调用enumDisplayDevices时,如果第一个参数是lpDisplayDevice.DeviceName,则会出现错误。 我知道这是第一个参数,如果它被设置为“IntPtr.Zero”,而不是错误。 我找不到如何在C#中执行此操作的另一个示例。 public static void show_display_devices() { DISPLAY_DEVICE lpDisplayDevice = new DISPLAY_DEVICE(0); // OUT int devNum = 0; while(true) { bool success = EnumDisplayDevices( IntPtr.Zero, devNum, ref lpDisplayDevice, 0); if( !success ) break; Console.WriteLine("\ndevNum =" + devNum); Console.WriteLine("cb =" + lpDisplayDevice.cb); Console.WriteLine("DeviceID =" + lpDisplayDevice.DeviceID); Console.WriteLine("DeviceKey =" + lpDisplayDevice.DeviceKey); Console.WriteLine("DeviceName =" + lpDisplayDevice.DeviceName.Trim()); […]

获取桌面/ shell窗口的句柄

在我的一个程序中,我需要testing用户是否正在关注桌面/shell窗口。 目前我使用user32.dll中的GetShellWindow(),并将结果与​​GetForegroundWindow()进行比较。 这种方法是一直工作,直到有人改变桌面墙纸,但一旦墙纸改变GetShellWindow()的句柄不再匹配从GetForegroundWindow()了,我不明白这是为什么。 ( 操作系统: Windows 7 32位) 有没有更好的方法来检查桌面是否集中? 优选地,如果用户改变壁纸,那么不会损坏的那个? 编辑:我devise了一个解决方法:我正在testing的句柄有一个“SHELLDLL_DefView”类的孩子。 如果有的话,桌面上的焦点。 虽然它在我的电脑上工作,但并不意味着它会一直工作。

SetFilePointerEx API来读取MFT

我想从一个分区上的MFT偏移读取一些字节。 我得到分区句柄,并成功读取第一个1K字节,但SetFilePointerEx返回一个错误。 请帮助我。 int nread = 0; IntPtr handle = IntPtr.Zero; byte[] buff = new byte[1024]; IntPtr newaddress = IntPtr.Zero; long MFTAddress = bytepersector * sectorpercluster * (long)MFTStart; string driveRoot = "\\\\.\\c:"; IntPtr hRoot = CreateFile(driveRoot, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero); SetFilePointerEx(hRoot, MFTAddress, ref newaddress, 0); int error = GetLastError(); […]

从其hex数中获取Windows系统错误代码标题/说明

我正在搞一些使用p / invoke的windows函数。 偶尔,我得到一个不是ERROR_SUCCESS的错误代码(这个奇怪的名字)。 有没有办法在程序中查看这些内容? 例如,如果我得到错误1017.我可以告诉用户 系统已尝试将文件加载或还原到registry中,但指定的文件不是registry文件格式。 (ERROR_NOT_REGISTRY_FILE:0x3F9) 代替 错误代码:1017