Articles of .net

是否有可能等到其他线程处理过程input消息?

我想模拟用户input到其他窗口可靠。 我为此使用SendInput ,但是之后我需要等到目标应用程序在发送更多消息之前处理input。 据我所知, SendInput ,尽pipe它的名字,真正的消息发送到队列,不等待,直到他们被处理。 我的尝试是基于这个想法,直到消息队列至less一次是空的。 因为我不能直接检查其他线程消息队列(至less我不知道这样做),所以我使用AttachThreadInput将目标线程的队列附加到该线程的队列,然后使用PeekMessage进行检查。 为了检查function,我使用一个窗口和一个button的小应用程序。 当点击button时,我调用Thread.Sleep(15000)有效地停止消息处理,从而确保在接下来的15s消息队列不能为空。 代码在这里: public static void WaitForWindowInputIdle(IntPtr hwnd) { var currentThreadId = GetCurrentThreadId(); var targetThreadId = GetWindowThreadProcessId(hwnd, IntPtr.Zero); Func<bool> checkIfMessageQueueIsEmpty = () => { bool queueEmpty; bool threadsAttached = false; try { threadsAttached = AttachThreadInput(targetThreadId, currentThreadId, true); if (threadsAttached) { NativeMessage nm; queueEmpty = !PeekMessage(out nm, hwnd, […]

为什么没有Microsoft.Win64命名空间?

我们有一个Microsoft.Win32命名空间,但它是保证在64位Windows环境中工作? 对于64位的情况,是否需要有相同的定义?

为什么通过WMI只应用一次静态IP地址?

我即将编写一个简单的networkingconfiguration工具,可以静态设置IP地址等,也可以通过WMI自动设置(DHCP)。 不幸的是,设置地址静态工作只是一次! 所以当你运行下面的testing函数时,一切都很完美(不要忘记// DYNAMIC的断点!)。 但在第二次,当您检查networking适配器的IP地址和子网掩码的控制面板的属性页中的结果保持空! 当然,没有抛出exception,并且方法调用的结果总是为零(0)。 代码在两台不同的Windows 7机器上进行了testing,当然还有pipe理员。 void Test() { // find management object ManagementClass networkManagementClass = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection networkManagement = networkManagementClass.GetInstances(); ManagementObject adapter = null; foreach (ManagementObject mo in networkManagement) { if ((bool)mo["IPEnabled"] && (string)mo["Caption"] == "[00000012] Intel(R) 82577LM Gigabit Network Connection") { adapter = mo; break; } } // STATIC var […]

强制Windows显示系统托盘图标

这是一个非常愚蠢的问题,但是这里有: 有没有办法(在.net中)强制Windows显示您的系统托盘图标,而不是隐藏它? 我不想一直这样做,但至less在第一次运行我的应用程序时,我希望它在系统托盘中可见。

为什么Process.MainWindowTitle总是空的,除了一个窗口?

当访问Process.MainWindowTitle如下… Process[] processes = Process.GetProcessesByName( "iexplore" ); …然后遍历结果数组,我总是以MainWindowTitle为空,除了数组中的一个MainWindowTitle ,其余都是空的。 在我的情况下,我打开了两个Internet Explorer窗口,一个带有一个选项卡,另一个带有两个选项卡。 运行我的代码,我总是得到窗口和标签,我上次活动的主窗口标题 – 所有其他人保持空白。 奇怪的是,填充MainWindowTitle的进程ID总是相同的 – 如果我在运行代码之前激活另一个IE窗口或Tab,进程ID总是相同的: if ( !processes.Any() ) { MessageBox.Show( "TODO – No matching process found" ); return; } if ( processes.Count() > 1 ) { foreach ( Process currentProcess in processes ) { // More than one matching process found checkedListBox1.Items.Add( […]

如何从Web服务器打印格式化的文本并确认打印成功?

我正在尝试构build一个系统,它将从Web服务器下载格式化的文本,打印格式化的文本,确认打印作业已成功完成,然后响应Web服务器以使其知道文本已打印。 全部没有用户input。 我已经成功地使用Web浏览器控件来下载HTML,然后打印它,而不需要用户input。 然而,这不能确认印刷。 它看起来像在System.Printing中,您可以访问PrintServer和PrintQueue,并使用它们来启动打印作业并查找打印作业的状态。 我还没有能够确认一个打印工作,但我已经能够开始简单的打印。 但是,这并不包含任何来自Web服务器的HTML格式。 我没有绑定到HTML,但它必须是可以由Web服务器产生的一些格式,所以可以改变而不需要更新客户端应用程序。 如何从Web服务器打印输出,格式正确,并知道打印作业是成功还是失败?

Windows – 用C#命名pipe道性能build议

我目前正在使用.NET / C#评估Windows上IPC的命名pipe道。 我目前正在寻找一个单一的生产者,一个消费者的情况。 有没有好的性能考虑指导方针? 在我的第一个testing案例中,我比较了大消息和小消息的速度,似乎是大(64k)消息发送的速度和小(48字节)的包一样快。 这是与默认参数。 我可能会添加更多的testing场景,但是这非常耗时,因此我正在寻找指导方针。

.NET:ListView的TopItem属性失败,并显示“ShowGroups”= true

我有一个ListView显示约300项。 当有东西被改变,我需要重新填充列表,我希望滚动位置不变,所以相同的项目仍然可见,并在列表中的相同位置。 “EnsureVisible”方法很糟糕,因为它符合“Visible”,而不是相同的位置(结果是感兴趣的项目总是滚动到列表的底部)。 我对这个问题的解决scheme是保存(我的)“ID”的List-> TopItem,重新填写列表,然后调用List-> TopItem = newItemWithSameID(需要设置两次,出于某种原因工作)。 这对于基本的“未分组”列表来说是一种魅力。 但是 – 如果列表中有“ShowGroups = true”,这是行不通的。 TopItem属性将永远是列表中的第一个项目,而不是文档中所说的第一个VISIBLE项目。 有解决scheme吗? 我search了一下,发现了另一个失去灵魂的同样的问题。 他有一个相当有趣的讨论微软的支持,没有成功。(http://social.msdn.microsoft.com/Forums/en/winforms/thread/8a81c5a6-251c-4bf9-91c5-a937b5cfe9f3)。 所以 – 我的问题是:有没有解决方法? 我真的需要把这个列表分组,当我的列表跳转时,我真的很讨厌。 我不会在这里粘贴任何代码,因为所有需要重现的代码都在上面的讨论中。 非常感谢!

如何检测Windows关机/注销并取消该操作(询问用户后)

一些解释:对于我正在处理的项目,我必须编写一个在后台运行的程序,检测对文件的更改,并将修改后的file upload到Web服务以使其他人可用。 非常简单的同步,如果它不是用户修改一个大文件,并决定在编辑后立即closures它的计算机的情况下。 我可以取消上传,并等待下一次重新启动上传,但我可以想象用户在第二天早上从networking上下载文件到另一台计算机,不明白为什么他昨天晚上的变化不存在。 所以我的想法是检测用户什么时候注销或者重新引导Windows,如果我正在上传,只是询问用户“我们还在同步刚才改变的文件Foo.txt 。你确定你想要重新启动?只有在重新启动计算机之后,您的更改才能被其他人使用!“ 如果用户说不,我需要取消重新启动/注销 这可能吗?

Windows SDK安装失败

我正在尝试为Windows 7安装Windows SDK与.NET Framework 4,但是当我打开安装程序时收到错误: 某些Windows SDK组件需要安装RTM .NET Framework 4.安装程序检测到.NET Framework 4的预发行版本。如果继续使用安装程序,则不会安装这些组件。 如果要安装这些组件,请单击取消,然后从https://go.microsoft.com/fwlink/?LinkID=187668安装.NET Framework 4,然后重新运行安装程序。 点击确定继续。 当我去安装.NET Framework 4时,出现一条消息,说我的PC上已经有了.NET Framework 4: Microsoft .NET Framework 4已经是操作系统的一部分。 无需安装.NET Framework 4可再发行组件。 更多信息 。 计算机上已经安装了相同或更高版本的.NET Framework 4。 我不知道该怎么办了。 我正在使用Windows 10 Enterprise(x64)。