Tag: winapi

使用自定义控制台颜色

要使用与ConsoleColor提供的颜色不同的颜色,我实现了代码,您可以在此处找到p / invoke 。 这个解决方案工作正常,我可以使用我想要的每个颜色/颜色代码。 但CONSOLE_SCREEN_BUFFER_INFO_EX只包含几种不同的颜色。 如果我将例如ConsoleColor.White更改为Color.LimeGreen并使用此颜色编写文本,则会重新着色,如果我稍后将ConsoleColor.White更改为另一种颜色。 例如: Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(“White text”); //text is white Console.ReadKey(true); ConsoleExtender.SetScreenColors(Color.Goldenrod, Color.Black); Console.WriteLine(“Goldenrod text”); //both lines are goldenrod Console.ReadKey(true); ConsoleExtender.SetScreenColors(Color.LimeGreen, Color.Black); Console.WriteLine(“LimeGreen text”); //all three lines are limegreen Console.ReadKey(true); 是否可以在运行时更改颜色,而无需重新显示已经可见的文本?

来自C ++的C#USB驱动程序:SetupDiGetDeviceInterfaceDetail

我试图从C#调用SetupDiGetDeviceInterfaceDetail时遇到问题。 它始终返回1784错误代码(“提供的用户缓冲区对请求的操作无效”)。 这是我的C#代码: Guid GUID_DEVINTERFACE_DFU = new Guid(0x3fe809ab, 0xfb91, 0x4cb5, 0xa6, 0x43, 0x69, 0x67, 0x0d, 0x52,0x36,0x6e); Guid classGuid = GUID_DEVINTERFACE_DFU; IntPtr hDevInfo = Win32.SetupDiGetClassDevs(ref classGuid, IntPtr.Zero, IntPtr.Zero, Win32.DIGCF_DEVICEINTERFACE | Win32.DIGCF_PRESENT); if (hDevInfo.ToInt32() == Win32.INVALID_HANDLE_VALUE) { Console.WriteLine(“read hardware information error”); } else { SP_DEVINFO_DATA devInfoData = new SP_DEVINFO_DATA(); devInfoData.cbSize = (uint)Marshal.SizeOf(typeof(SP_DEVINFO_DATA)); devInfoData.classGuid = Guid.Empty; devInfoData.devInst = […]

是否可以在不使用win32 API库的情况下获取在C#中连接的IP地址列表。

我正在尝试获取在LAN中连接的IP地址列表,是否可以不使用win32 API库。(Netapi32.dll)。 任何想法得到一个没有使用非托管的win32动态library.target到Windows 7操作系统

有没有办法为Windows窗体中的特定按钮挂钩鼠标事件

我想从特定窗口内的特定按钮挂钩WM_MOUSEDOWN和WM_MOUSEUP事件。 我在想SetWindowsHookEx将挂钩我想要的消息。 和FindWindowEx将帮助我找到我想从中捕获这些事件的窗口句柄。 我只是不知道如何让它从特定的窗口句柄给我事件。 或者如何确定消息应该处理的句柄。 任何有这方面经验的人都会非常感谢 编辑 或者,使用C#中的Spy ++工具代码或ManagedSpy的工作副本或类似代码。 我想学习导航窗口句柄层次结构并从那些钩子窗口事件。

如何以另一个用户la / netonly启动Internet Explorer进程?

我正在尝试从我们的WPF应用程序启动Internet Explorer作为另一个用户,这样当我们的用户访问(内部)网站时,他们通过集成Windows身份validation进行静默身份validation。 我们不希望将iexplore.exe作为其他用户启动,因为在计算机上首次启动进程时会出现奇怪的部署/环境问题,并且它首次尝试设置IE7 / 8。 但是,如果你有一个如何在每台机器上静音每个IE安装程序的解决方案,我很乐意听到它。 回到我想要的问题。 我可以使用runas从命令提示符中获取我想要的IE模拟行为*(感谢https://serverfault.com/questions/70376/runas-domain-account-still-asks-for-password ): c:\> runas /noprofile /netonly /user:MyDomain\MyUser iexplore.exe *注意:由于很多原因,我不能在我们的WPF应用程序中使用runas ,但最终结果是我想要的。 无论如何,我想要运行runas /noprofile /netonly iexplore.exe的C#等效代码。 我在CreateProcessWithLogonW P / Invoke中途。 这就是我所拥有的: uint LOGON_NETCREDENTIALS_ONLY = 2; var lpStartupInfo = new CreateProcessWithLogonW_PInvoke.STARTUPINFO(); CreateProcessWithLogonW_PInvoke.PROCESS_INFORMATION processInformation; CreateProcessWithLogonW_PInvoke.CreateProcessWithLogonW( userName, domain, pw, LOGON_NETCREDENTIALS_ONLY, null, commandLine, 0, null, null, ref lpStartupInfo, out processInformation); 这成功启动了Internet Explorer,但似乎根本没有模仿用户。 我能够通过runas命令模拟用户,所以我98%确定validation失败不是IE /区域/密码/ […]

C#/ Native:使用SCSI PassThrough读取硬盘串口

我编写了三种不同的方法,使用本机CreateFile和DeviceIoControl调用来检索HDD序列号(而不是型号)。 第一个使用SMART ,第二个使用Storage Query ,第三个使用SCSI PassThrough 。 我的大多数代码都基于此线程的内容(带有一些修复和改进)。 以下是我使用diskid32实用程序获得的结果: Trying to read the drive IDs using physical access with admin rights Drive Model Number________________: [ST975XXXXX] Drive Serial Number_______________: [ 6WS2XXXX] Trying to read the drive IDs using physical access with zero rights Product Id = [ST975XXXXX] Serial Number = [6WS2XXXX] Trying to read the drive […]

DllImport vs LoadLibrary,最好的方法是什么?

我通常在c#.NET中使用Win32 API。 但不要在一个应用程序中声明所有内容。 有时通常使用user32,有时gdi32 ……我想当我声明所有api函数时,那些使用大量内存。 在.NET中使用API​​的最佳方法是什么?

从C#关闭最小化/图标化过程

这是我的问题:我需要从C#程序关闭已经运行的进程。 问题是该进程现在作为一个图标运行(最小化到任务栏),除非用户至少打开一次(在无人值守的机器上永远不会发生),它将永远不会有一个主窗口。 我的另一个要求是应用程序关闭而不是被杀死 。 我需要它将它的内存缓冲区写入磁盘 – 并且杀死它会导致数据丢失。 这是我到目前为止所尝试的: foreach (Process proc in Process.GetProcesses()) { if (proc.ProcessName.ToLower().StartsWith(“myapp”)) { if (proc.MainWindowHandle.ToInt32() != 0) { proc.CloseMainWindow(); proc.Close(); //proc.Kill(); <— not good! } } } 在窗口最小化后发现MainWindowHandle == 0之后,我添加了if子句。 删除if无济于事。 CloseMainWindow()和Close()都不起作用。 杀戮()确实如此,但如上所述 – 这不是我需要的。 任何想法都会被接受,包括使用神秘的Win32 API函数:)

同时移动2个表单

我在这里停留了一下。 我试图在不使用OnMove,LocationChanged,Docking等的情况下同时移动2个表单。 与其位置进行交互的唯一方法是覆盖WndProc。 可能有用的东西是表单A是表单B的所有者。因此,每当A移动时,我也想移动B. 不是相同的位置,但相同的距离。 protected override void WndProc(ref Message m) { if (m.Msg == 0x0084) { Form[] temp = this.OwnedForms; if(temp.Length > 0) { /* moving temp[0] to the same ratio as this form */ } m.Result = (IntPtr)2; return; } base.WndProc(ref m); } A和B都具有相同的WndProc,因为它们是来自同一类的2个对象。

为什么GetWindowText会挂起一个“关闭”的句柄而不是一个随机句柄

使用以下代码 [DllImport(“user32.dll”, EntryPoint = “GetWindowText”, ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount); public static String GetWindowText(IntPtr hWnd) { StringBuilder title = new StringBuilder(MAX_TITLE_LENGTH); int titleLength = WinAPI.GetWindowText(hWnd, title, title.Capacity + 1); title.Length = titleLength; return title.ToString(); } 如果将句柄传递给最近关闭的应用程序,GetWindowText将挂起(IE:永不返回)。 (这对我来说很奇怪,因为我原以为它会以零值返回) 传入随机句柄(如new IntPtr(123456)成功并返回无值。 有人可以解释一下这种行为吗?