Tag: winapi

如何在C#中使用RegisterHotKey()?

我正在尝试注册一个热键,我正在翻译这个 C ++代码,我写道: using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [DllImport(“user32.dll”)] public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, int vk); [DllImport(“user32”)] public static extern bool GetMessage(ref Message lpMsg, IntPtr handle, uint mMsgFilterInMain, uint mMsgFilterMax); public const int MOD_ALT = 0x0001; public const int MOD_CONTROL = […]

如何以CLR“友好”的方式获取_real_线程ID?

作为练习,我正在编写一些代码来显示进程内的O / S进程和O / S线程(如Sysinternals进程资源管理器那样)。 我发现.net的ManagedThreadId(s)不是O / S线程ID。 经过一些阅读后,我遇到了AppDomain.GetCurrentThreadId()。 不幸的是,该function被标记为“过时”(这可能意味着将来“不可用”)。 我找到的一个解决方案是使用InteropServices直接调用Win32 GetCurrentThreadId。 我很好,但是,它与.net哲学背道而驰。 我的问题是:是否有一种CLR“友好”的方式来获取当前线程的真实ID? 作为参考,这里有一段代码,显示了我到目前为止所尝试的内容。 // 1和// 2显示正确的线程ID,// 3和// 4尝试以CLR友好的方式获取相同的信息(但它们不起作用。) 谢谢您的帮助, 约翰。 [DllImport(“kernel32.dll”)] static extern int GetCurrentThreadId(); static void Main(string[] args) { // AppDomain.GetCurrentThreadId() is “obsolete” int ThreadId1 = AppDomain.GetCurrentThreadId(); // 1 // not the “.net” way of doing things int ThreadId2 = GetCurrentThreadId(); // […]

EnumWindows的问题

使用EnumWindows枚举窗口时,我的桌面上每个打开的窗口都会有数百个句柄而不是一个句柄。 首先,我很好奇这是否是正确的行为。 其次,尝试在启动进程之前和之后打开窗口之间的区别会返回15-20个新句柄。 我想知道是否有办法根据一些标志过滤这些,我真的只需要主窗口句柄。 有任何想法吗?

如何将自定义工具栏(DeskBand?)放在Windows 7中的任务栏上赢得WPF?

如何在任务面板之前将自定义工具栏放在Windows 7的任务栏上? 有一个名为Pokki的流行应用程序可以做到这一点。 我想知道我该怎么做? 编辑1:我需要100%的方式来访问Windows 7的自定义工具栏(DeskBand?)。我不是在寻找一个pin-an应用程序解决方案,而是一种构建能够处理自己的消息并显示它的自定义解决方案的方法自己的图标。 C#方式非常感谢。 Edit2:非常感谢WPF方式。

如何将.NET exe转换为本机Win32 exe?

如何将.NET exe转换为Win32 exe? (我没有代码)目的是使用wine在Linux中运行应用程序。 我认为.NET exe不能在wine中运行,我不想使用mono。

使用C#从另一个应用程序的SysListView32中的数据网格中读取单元格项

我试图使用C#.net ui-automation和winapi读取另一个进程的SysListView32中的数据网格项 使用ui-automation的C#代码 http://pastebin.com/6x7rXMiW 使用winapi的c#代码http://pastebin.com/61RjXZuK 使用此代码,您只需将鼠标指针放在屏幕上的SysListView32上,然后按Enter键。 现在,两个代码在具有以下属性的单元格项上返回空 pastebin.com/Rw9FGkYC 但这两个代码都适用于以下属性 pastebin.com/L51T4PLu 唯一的区别我注意到name属性包含与单元格中相同的数据,但是当name属性为空时会出现问题。 有没有其他方法来阅读细胞? 或者我可以做的任何改变,请详细说明。

Windows API和.net语言

人们总是告诉我,如果我正在做一些应该使用一些Windows API来完成任何进程级别工作的应用程序,我必须使用VC ++而不是任何其他.net语言。 这有什么道理吗? 使用VC ++可以完成的一切都可以用其他.net语言完成吗? 当比较它们的function时,所有的.net语言都是一样的吗?

检测到CallbackOnCollectedDelegate

我是一个应用程序的子类。 我的子类Window过程在DLL中。 我在DLL中的子类代码看起来有点像这样(剥离,删除其他非相关部分)。 class FooBar { private delegate int WndProcDelegateType(IntPtr hWnd, int uMsg, int wParam, int lParam); private const int GWL_WNDPROC = (-4); private static IntPtr oldWndProc = IntPtr.Zero; private static WndProcDelegateType newWndProc = new WndProcDelegateType(MyWndProc); internal static bool bHooked = false; [DllImport(“user32.dll”)] private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, WndProcDelegateType dwNewLong); [DllImport(“user32.dll”)] private […]

使用c#获取在其他应用程序的文本框中输入的文本

我整天都在和这件事打架。 我仍然无法找到确切的解决方案。 帮帮我。 我的目标非常简单。 我想获取其他应用程序的文本框中的文本。 它可能是gtalk客户端或soap UI屏幕的文本框。 我用谷歌搜索,大多数论坛建议winapi是我必须用来实现这一目标的概念。 我从未使用过这个概念,也没有得到任何好的例子。 请帮助我解决这个问题,并完成这件事。 有没有其他方法来实现这一目标? 等待你的回复…

在C#/ .NET中访问MAX_PATH之外的文件

背景 我需要编写一个使用.NET 2.0版本的工具(由于政治,商业和机密性/信任原因,使用现成的东西不是这个客户的选项)通过网络将文件从一个服务器迁移到另一个服务器。 服务器是本地团队的文件服务器,需要将某些团队文件夹迁移到其他服务器以便于重组。 基本的想法是我们读取每个文件并在数小时内通过网络流式传输,几天后数据将被迁移。 需要保留文件权限。 由于这需要几天时间(我们正在谈论几千兆字节的数据,对于某些团队而言),我们需要每晚迭代文件并比较修改日期并更新已更改的日期。 理论上,最终新服务器将拥有最新的文件副本,用户可以切换到新服务器。 它当然不是那么简单,但我们有一个我们认为应该工作的设计:) 问题 所以从理论上讲,我们只需打开文件,通过网络流式传输,然后在另一端写入,对吧? 🙂 不幸的是,在服务器本身,文件共享是在文件夹路径创建的,例如: D:\ Data \ Team Shares \ DIVISION \ DEPARTMENT \ NAME OF TEAM – 可能会长篇大论 对于每个用户,此路径映射到驱动器,例如,它将作为\\ SERVER \ TEAMNAME共享并映射到T:驱动器。 这导致了从T:驱动器可见的文件在MAX_PATH限制范围内的情况,但是当在服务器本身上本地查看时,它们会超出它。 我们无法使用网络共享来访问文件,因为这个工具需要是通用的,要在数百个这样的服务器上运行,并且没有标准的方法来判断哪些文件共享是我们应该移动的文件共享,哪些不是 – 有甚至没有命名约定标准。 此外,偶尔会有其他股份的子股,因此我们超过MAX_PATH限制两倍! 我知道使用“\\?\”前缀指定路径的解决方法,该路径将路径视为UNC路径,并允许理论上最多32k个字符。 这种解决方法是在Win32 API级别实现的,System.IO命名空间(大部分)基本上只是本机Win32 API函数的一个薄包装,但是在将调用交给API之前,Microsoft已经“帮助”实现了额外(不正确)的validation。 。 在这种情况下,.NET Framework拒绝该路径,因为它声称’?’ 是一个无效的路径字符。 所以我的问题是……有没有一种方法我没有想到这将允许我解决这个问题,而不必完全重写几乎整个System.IO命名空间,加载P / Invoke调用,只是为了删除这个烦人的validation?