我需要以编程方式处理另一个Windows应用程序,搜索谷歌我找到了一个示例,它使用DLLImport属性处理Windows计算器并将user32.dll函数导入C#中的托管函数。应用程序正在运行,我正在获取主窗口的句柄,即计算器本身,但之后的代码无法正常工作。FindWindowEx方法不返回计算器子项的句柄,例如按钮和文本框。我尝试在DLLImport上使用SetLastError=True并发现我收到错误代码127,即“未找到过程”。这是我从中获得示例应用程序的链接:http://www.codeproject.com/script/Articles/ArticleVersion.
我正在尝试获取位于我的C#2.0应用程序之外的窗口的可执行文件的名称。我的应用程序当前使用来自“user32.dll”的GetForegroundWindow()调用获取窗口句柄(hWnd)。根据我能够进行的挖掘,我想我想使用GetModuleFileNameEx()函数(来自PSAPI)来获取名称,但是GetModuleFileNameEx()需要一个进程的句柄,而不是一个窗口。是否可以从窗口句柄获取进程句柄?(需要先获取窗口的线程句柄吗?)编辑了第一句话,使我想做的事情更清楚。更新!这是我发现对我有用的C#代码。唯一需要注意的是,偶尔它会返回驱动器号为“?”的文件/路径。而不是实际
我想从用户那里获取网络登录凭据。我正在使用.NET3.5和C#。到目前为止,我使用的是CredUIPromptForCredentials调用(可以找到关于如何使用它的非常有用的链接here)我的问题是CredUIPromptForCredentialsAPI调用显示旧的windows2000/XP凭据对话框而不是新的Vista/7。我在msdn上读到我应该使用CredUIPromptForWindowsCredentials功能。有人可以发布一个如何在C#中使用它的示例吗?我还需要能够获取输入的凭据。 最佳答案 我设法实现了一个适
我有一个RichTextBox,我需要在其中频繁更新Text属性,但是当我这样做时,RichTextBox会烦人地“闪烁”,因为它会在整个方法调用过程中刷新。我希望找到一种简单的方法来暂时抑制屏幕刷新,直到我的方法完成,但我在网上找到的唯一方法是重写WndProc方法。我已经采用了这种方法,但有一些困难和副作用,而且它也使调试更加困难。似乎必须有更好的方法来做到这一点。有人可以指出更好的解决方案吗? 最佳答案 这是完整的工作示例:privateconstintWM_USER=0x0400;privateconstintEM_SETE
我有打开的应用程序列表。为了获得这个列表,我使用了以下代码internalstaticclassNativeMethods{publicstaticreadonlyInt32GWL_STYLE=-16;publicstaticreadonlyUInt64WS_VISIBLE=0x10000000L;publicstaticreadonlyUInt64WS_BORDER=0x00800000L;publicstaticreadonlyUInt64DESIRED_WS=WS_BORDER|WS_VISIBLE;publicdelegateBooleanEnumWindowsCallback
如何在C#中将控制台应用程序窗口置于最前面(尤其是在运行VisualStudio调试器时)? 最佳答案 它很老套,很可怕,但对我有用(谢谢,pinvoke.net!):usingSystem;usingSystem.Diagnostics;usingSystem.Runtime.InteropServices;usingSystem.Threading;publicclassTest{[DllImport("user32.dll")][return:MarshalAs(UnmanagedType.Bool)]staticextern
如何确定哪个版本的Windows?WinXP、Vista或7等32位还是64位?UPD:适用于.Net2.0-3.5 最佳答案 您正在查找Environment.OSVersion、Environment.Is64BitProcess和Environment.Is64BitOperatingSystem属性。在.Net4.0之前,可以通过检查IntPtr.Size是否为8来判断进程是否为64位,而你可以使用thiscode检查操作系统是否为64位:publicstaticboolIs64BitProcess{get{returnIn
我正在尝试Hook第3方应用程序,以便我可以在其屏幕上绘图。在屏幕上绘图很容易,我不需要任何帮助,但我似乎在使用SetWindowsHookEx处理WH_GETMESSAGE时遇到了问题。我不知道要为最后两个参数传递什么。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceWindowDr
在使用PInvoke时,我注意到我们需要使用IntPtr来引用Windows句柄。我想知道为什么不直接使用int作为句柄?我对句柄的理解是它只是一个整数值。 最佳答案 Windows句柄被定义为本地机器指针大小的整数。这样一来,如果需要,他们就可以secret地成为指导者。(句柄可能不是指针,但如果操作系统实现者认为有必要,它是允许的。出于安全原因,它们通常不是指针;它如果他们实际上是指针,那么人们很容易滥用该系统。)C#中定义为32位整数的int,在64位机器上太小了。IntPtr被定义为一个整数,可以容纳机器大小的指针。这就是为
我有一个WPF应用程序,当拖动操作开始时,它在某些计算机上崩溃并出现AccessViolationException。困难在于它只发生在我们构建服务器的构建上,当我在VisualStudio2010中本地构建时永远不会崩溃。所以我无法单步执行代码。我有以下信息:我们正在使用.net4.0仅当应用程序作为64位进程运行时崩溃,32位没问题。只有来自构建服务器的构建才会崩溃。不会在每台计算机上崩溃,只会在我们这里的一小部分笔记本电脑上崩溃。顺便说一句,都是同一个型号和硬件配置。都有Windows7,有的有sp1,有的不要。我应该采取什么下一步来诊断这个问题?这是崩溃的堆栈跟踪,它似乎发生在