Tag: winapi

我什么时候需要Windows SDK以及什么是.NET?

我是一名学生,在完成了Java,C的入门编程课程之后,刚刚完成了一本关于C ++的书,我想开始为Windows开发应用程序。 我已经尽力通过谷歌页面找到我需要的答案,但我似乎不知所措。 我什么时候才需要Windows SDK而不是常规API? 什么是.NET,为什么我需要它? C#有什么特别之处,我应该使用C / C ++吗?

C# – 如何将IntPtr缓冲区数据保存到文件(最快的方式)?

我正在使用此代码将非托管代码中的IntPtr缓冲区中的字节保存到文件中。 这是一个简单的回调函数: private void callback(IntPtr buffer, int length) { byte[] bytes = new byte[length]; Marshal.Copy(buffer, bytes, 0, length); FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write); file.Write(bytes, 0, length); file.Close(); } 我想要的是将这些数据存储到文件中并将其丢弃。 根据我的理解,非托管代码中有一个缓冲区,MY代码中有第二个缓冲区。 我不想复制我想要的数据: // bad: (unmanaged) buffer -> (managed) bytes -> file // awesome: (unmanaged) buffer -> file 对于我的任务,我需要以最快捷的方式将数据存储到文件中。

使用C#/ Win32将文本写入记事本

我正在搞乱Win32 API和Windows消息传递,试图找出工作原理,我发现这个问题非常有用 。 我想改进那里提供的解决方案,以便它附加文本,而不是仅通过WM_SETTEXT替换记事本中的文本。 我的问题是,如何使用WM_GETTEXTLENGHT,然后使用WM_GETTEXT来获取记事本窗口中的当前文本,以便在使用WM_SETTEXT之前我可以在其中添加新文本? 使用WM_XXXTEXT是否适用于32位和64位计算机? 如果记事本中有很多文本,那么建议的get / set算法是否仍然有用,或者它会占用大量资源? 如果是这样,是否有另一种方法将文本附加到记事本窗口而不先复制其中的所有内容? 谢谢你的帮助!! 更新: 以下是我根据David Heffernan的帮助和Google / SO切割粘贴提出的代码。 由于我是Win32API的新手,并且从不同的来源复制了很多行,所以我很感激所有的反馈。 [DllImport(“User32.dll”, CharSet = CharSet.Auto)] extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, [In] string lpClassName, [In] string lpWindowName); [DllImport(“User32.dll”, EntryPoint = “SendMessage”)] extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); [DllImport(“User32.dll”)] public static extern int SendMessage(IntPtr […]

什么是Windows 10的supportedOS GUID?

我们正在检测统计数据的OS版本。 从Windows 8.1开始, 操作系统在使用GetVersion时“谎称”其版本 。 但是,从.NET 4.5.1开始, System.Environment.OSVersion 仍然调用此API 。 因此,我们在清单中添加了8.1的GUID ,效果很好。 现在,我想为Windows 10做同样的准备。这个GUID是否已知? (编辑)P /调用VerSetConditionMask和VerifyVersionInfo检查6.4或更高似乎确实有效。

外部应用程序窗口移动时移动窗口

我有一个总是在顶部的应用程序(基本上是一个状态显示),我想跟随另一个程序,并始终坐在最小化按钮的左侧。 我可以使用以下代码获取表示“目标”过程的Rect ,然后我可以将其与偏移量配对以生成叠加层的初始位置。 获取HWnd IntPtr: private IntPtr HWnd = Process.GetProcessesByName(“targetapplication”)[0].MainWindowHandle; 从user32.dll声明函数: [DllImport(“user32.dll”, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); 和适当的struct : [StructLayout(LayoutKind.Sequential)] private struct RECT { public int Left; public int Top; public int Right; public int Bottom; } 然后按需调用它。 但是,我想避免不断轮询这个值,所以我想挂钩到目标应用程序并在目标窗口移动时响应。 查看user32.dll文档,我能看到的唯一方法是使用SetWindowsHookEx() 。 但是,我并不完全确定如何从这里拦截一个事件。 我相信目标应用程序是基于WinForms构建的,但我无法确定。 因此,让我响应目标的Move事件或直接响应某些Windows消息的解决方案都很有用。 关于如何进行的任何想法?

从C#托管代码调用win32 CreateProfile()

快速问题(希望如此),如何从C#(托管代码)正确调用win32函数CreateProfile()? 我试图自己设计一个解决方案但没有用。 CreateProfile()的语法是: HRESULT WINAPI CreateProfile( __in LPCWSTR pszUserSid, __in LPCWSTR pszUserName, __out LPWSTR pszProfilePath, __in DWORD cchProfilePath ); 支持文档可以在MSDN库中找到。 我到目前为止的代码发布在下面。 DLL导入: [DllImport(“userenv.dll”, CharSet = CharSet.Auto, SetLastError = true)] private static extern int CreateProfile( [MarshalAs(UnmanagedType.LPWStr)] string pszUserSid, [MarshalAs(UnmanagedType.LPWStr)] string pszUserName, [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, uint cchProfilePath); 调用函数: /* Assume that a user has been created using: […]

如何在另一个应用程序中挂钩api调用

我试图挂钩另一个应用程序的ExtTextOut和DrawTextExt GDI方法调用。 我知道我需要使用GetProcAddress来查找gdi32.dll中这些方法的地址,并覆盖我想要挂钩我的函数地址的进程中的地址。 然后在我的函数中,我做我需要的,然后调用原始函数。 我想让这个钩子function可用于.net应用程序,显然这可以通过创建一个“中间”非托管dll来实现挂钩,并且能够在.net端触发事件,以便新的function可以在托管环境中下注。 我只是不确定如何实现这一点。 有没有人有任何代码示例或信息链接?

如何判断鼠标是否位于顶级窗口之外?

如何有效地判断鼠标是否位于顶级窗口之外? 通过“over”,我的意思是鼠标指针位于顶级窗口的客户端矩形内, 并且在鼠标指针位置的窗口上没有其他顶级窗口。 换句话说,如果用户点击该事件将被发送到我的顶级窗口(或其子窗口之一)。 我使用Windows Forms在C#中编写,但我不介意使用p / invoke来进行Win32调用。

C#:调试器中的comctl32.dll版本6

我正在使用WindowsAPICodePack for TaskDialog。 当我尝试显示对话框时,它说它需要加载comctl32.dll的第6版。 所以我在app.manifest中添加了第6版并尝试运行它。 仍然没有运气。 我去了Debug文件夹并运行没有Visual Studio的程序,它工作正常。 我猜测Visual Studio没有使用清单文件……我想知道是否有办法让它做到这一点。

来自user32.dll的FindWindowEx使用dllimport返回零句柄和错误代码127

我需要以编程方式处理另一个Windows应用程序,搜索谷歌我找到了一个使用DLLImport属性处理Windows计算器的示例,并在C#中将user32.dll函数导入托管应用程序。 应用程序正在运行,我正在获取主窗口的句柄,即计算器本身,但后续代码不起作用。 FindWindowEx方法不返回计算器子项的句柄,如按钮和文本框。 我尝试在DLLImport上使用SetLastError = True,发现我收到错误代码127,即“找不到过程”。 这是我从中获取示例应用程序的链接: http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=14519&av=34503 如果有人知道如何解决它,请帮忙。 更新:DLLImport是: [DllImport(“user32.dll”, SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); 不起作用的守则是: hwnd=FindWindow(null,”Calculator”); // This is working, I am getting handle of Calculator // The following is not working, I am getting hwndChild=0 and err = 127 hwndChild = FindWindowEx((IntPtr)hwnd,IntPtr.Zero,”Button”,”1″); […]