Tag: winapi

使用字符串分隔对字符串进行标记

如果我有一个字符串 “这是一个将被这个和那个分开的字符串” 我想把拆分结果作为 “是一个将被拆分的字符串” “然后” “这是一个字符串” “将由此分裂,” 1和2被“this”分开3和4被“that”分开 我的解决方案是使用字符串映射到字符串并将结果存储在相同类型字符串到字符串的另一个映射中。 然而,对于更复杂和更长的文本,存储在映射中的结果变得重复,即如在上面的1和3中那样重复子串“是字符串”并且该冗余产生不正确的统计结果。 您能否提供一个更好的解决方案来使用不同长字符串的分隔符来标记长字符串?

C# – 什么时候打电话给base.OnSomething?

我正在使用Windows.Forms并且必须inheritance一些控件来提供自定义行为。 这种inheritance显然会导致方法覆盖。 所以,这里有一个问题 – 在哪种情况下调用base.OnSomething(…)的顺序可以真正影响程序的可见行为? protected override OnRetrieveVirtualItem(RetrieveVirtualItemEventArgs e) { // base.OnRetrieveVirtualItem(e); – Could this potentially break something? // Perform your custom method. // … base.OnRetrieveVirtualItem(e); // Is this always “correct”? } 据我所知,当重写与绘画相关的方法( OnDrawItem, … )时,这个顺序很重要,但我想还有其他一些方法可以在腿上拍摄自己,因为Windows.Forms会做很多事情。非托管代码调用可能的副作用。 那么,什么时候可能重要? 在这些情况下,选择正确的位置来调用base方法有哪些经验法则?

使用Pinvoke调用advapi.dll:CryptDecrypt和CryptEncrypt意外行为

这是这个问题的后续行动。 我从VB.net调用WinAPI Cryptography函数以确保与共享结果数据的旧产品兼容。 该代码运行良好多年,但是我最近在Windows Server 2012上运行时遇到了问题。在看了各种示例和我之前的问题的答案后,我给了代码一个大修,包括改变以前的字符串变量为Byte数组,我认为这是更正确的function。 以前它如何使用字符串我不知道,但在修复原始的Server 2012问题之后,由于字符串的NTE_BAD_LENGTH而失败了。 现在,在将字符串转换为字节数组之后,代码似乎不会像以前那样加密,也不会解密CryptEncrypt生成的内容。 代码的主要部分如下: (调用CryptCreateHash,CryptHashData,CryptDeriveKey在此之前) Dim _encoding As System.Text.ASCIIEncoding = New System.Text.ASCIIEncoding() Dim data As String = “Testing123″ ”define test String Debug.WriteLine(“Test Data: ” & data) ”convert data to Byte() Dim _bigBuffer As Byte() = New Byte(127) {} ”Buffer to be encrypted Dim _dataBuffer As Byte() = _encoding.GetBytes(data) ”Get […]

获取任何活动窗口的内容

我正在努力找到一种可靠的方法来获取当前位于前台的窗口的内容/文本。 如果可能,它应该能够确定用户当前正在使用的每个可能程序中的文本 我尝试了什么: 截取当前活动窗口的屏幕截图 ,应用一些filter并运行OCR算法 (tesseract .Net wrapper)。 这可行,但需要很长时间,并不是很准确。 然后我尝试了一些Windows API函数 (FindWindow和SendMessage),如此处所述。 例如,我可以让它运行标准编辑器(记事本),但不适用于大多数其他程序 我还尝试使用AutoHotKey和WinGetText函数以及.Net Wrapper 。 在这里,我只是得到一些关于窗口的信息,但绝不是它的文字…… 不幸的是,现在,我没有任何其他想法该做什么,因为我被困在各方面……有人有这方面的经验或知道一种有效的方式吗? 任何建议都非常感谢

当父NT服务被杀/崩溃时杀死子进程

我有一个Windows NT服务和第三方exe,我想作为NT服务的子进程运行,这样一旦我的NT服务进程崩溃,这个子进程也被杀死 为此,我找到了在父进程被终止时使用Kill子进程执行此操作的方法 我试图实现它,并使用普通的父进程正常工作,但当我在我的NT服务中做同样的事情,因为父SetInformationJobObject方法返回false和错误代码0的exception 例外:_COMPlusExceptionCode = -532462766 正常进程和导致此exception的NT服务进程有什么区别? 我正在使用Win2k8 R2 Server机器和C# [EDIT1]exception:GenericParameterAttributes =’((System.Reflection.RuntimeConstructorInfo)(ex._exceptionMethod))。ReflectedType).GenericParameterAttributes’抛出类型’System.InvalidOperationException’的exception{“”方法只能在类型上调用Type.IsGenericParameter是真的。“} 编辑2:因为在函数定义中使用DLLImport没有将SetLastError设置为true,所以最后一个错误是错误的正确ErrorCode是24表示结构的坏结果,那么应该是什么正确的结构? 编辑3:在我的64位win2k8R2服务器机器的NT Servce的情况下预期的正确长度似乎是144而不是上面的post中定义的112 编辑4:这是否是这样做的唯一方法,做同样的其他选择是什么?

GetModuleFileNameEx函数返回错误的系统进程路径

在我的WPF项目中,我通过GetModuleFileNameEx方法接收当前正在运行的进程的路径。 它适用于大多数情况,但是例如当当前运行的进程是“Windows资源管理器”( 系统进程 )时,我得到“C $Å”(以及其他随机字符)。 Delphi开发人员在这里和这里都有类似的问题。 第一个问题是通过设置调试权限来解决的。 不幸的是,看来,这对C#没有帮助… 这是方法: [DllImport(“psapi.dll”, SetLastError = true)] private static extern int GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, StringBuilder lpFilename, int nSize); 在这里我称之为方法: // Get module file name var buffer = new StringBuilder(4096); GetModuleFileNameEx(hProcess, IntPtr.Zero, buffer, buffer.Capacity); process = buffer.ToString(); 有没有人面临类似的问题或有想法如何解决这个问题? 谢谢。 顺便说一句,我正在运行Windows 8.1,64bit机器。

全局低级键盘钩冻结在c#.net 3.5中

注册全局钩子我有一个令人沮丧的问题。 我在我的Windows应用程序中使用此类: using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; class InterceptKeys { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; public static void Hook() { _hookID = SetHook(_proc); } private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess […]

WS_EX_NOACTIVATE和WinForms有两个问题

在我的一些应用程序中,我使用WS_EX_NOACTIVATE 扩展窗口样式值 (例如,创建虚拟键盘或托管在另一个程序中的表单)。 此值可防止表单获得焦点。 以下是我的进展方式: protected override CreateParams CreateParams { get { CreateParams p = base.CreateParams; p.ExStyle |= Win32.WS_EX_NOACTIVATE; return p; } } 它运作良好,但我注意到这个解决方案有两个问题: 用户无法通过按“Tab”在控件之间移动 当用户拖动表单时,我们无法看到位移(表单在移动过程中不重绘) 那么,是否有可能解决这些问题,或者至少可以实施一些替代方案? 也许WS_EX_NOACTIVATE不是最好的解决方案吗? 非常感谢!

如何启动stdin重定向的进程,但不是stdout?

我正在尝试启动一个子进程,将stdin重定向到我自己创建的句柄,但是让stdout和stderr指向子进程的控制台窗口。 例: var processStartInfo = new ProcessStartInfo(m_Exe) { UseShellExecute = false, RedirectStandardInput = true, }; m_Process = new Process {StartInfo = processStartInfo}; m_Process.Start(); m_StdIn = m_Process.StandardInput; // write a line to the subprocess m_StdIn.WriteLine(“”); 问题是设置RedirectStandardInput也会导致stdout和stderr被截获。 如果未设置RedirectStandardInput,则子进程的输出将正确发送到子进程的控制台窗口。 查看底层的win32 apis, http : //msdn.microsoft.com/en-gb/library/windows/desktop/ms686331%28v=vs.85%29.aspx说: 如果dwFlags指定STARTF_USESTDHANDLES,则此成员[hStdOutput]是进程的标准输出句柄。 否则,将忽略此成员,标准输出的缺省值是控制台窗口的缓冲区。 我们必须设置STARTF_USESTDHANDLES才能重定向stdin; 还有其他方法将stdout指向控制台窗口吗?

子对话窗口上的FindWindowEx

我正在尝试获取子对话窗口的句柄。 我尝试过使用FindWindowEx,但它没有用。 相反,FindWindow确实有效。 我使用visual studio的选项窗口进行了实验,其代码如下: IntPtr vsHandle = Process.GetProcessById(vsProcessId).MainWindowHandle; // consistent with spy++’s parent handle of options window IntPtr optionsHandle = FindWindowEx(vsHandle, IntPtr.Zero, “#32770”, “Options”); // returns 0 IntPtr optionsHandle2 = FindWindow(“#32770”, “Options”); // returns correct handle 根据我的理解,FindWindowEx应该工作,它是一个子窗口。 我正在运行windows xp,并且还尝试使用FindWindowEx(vsHandle,IntPtr.Zero,“#32770”,null)。 没工作。 看起来像获取它的唯一方法是使用FindWindow,这是不够好的,因为可以打开具有相同对话框的两个父实例。 这是声明: [DllImport(“user32.dll”)] Private static extern IntPtr FindWindow(string className, string windowTitle); [DllImport(“user32.dll”)] Private static […]