Tag: winapi

以编程方式获取Win32传统控件的工具提示文本

我想获得win32遗留控件的工具提示文本(不是WPF控件本身支持UI自动化 )。 我做了什么: 给定一个感兴趣的按钮,我有它的AutomationElement ,以及它的边界矩形 我将鼠标移到了这个按钮上(代码中); Thread.Sleep(1500)等待弹出工具提示控件; 枚举Desktop的所有子窗口,并获取子窗口tooltipAutomationElement ,其类型为”Tooltip” ; 从tooltipAutomationElement获取此工具提示的name属性,该属性对应于工具提示字符串。 这实际上是有效的,但惩罚是:我必须sleep(1500)并手动等待工具提示出现(5-20​​个按钮将被扫描工具提示字符串),这与性能要求不符。 预期结果(不确定是否可行) 以编程方式获取按钮的工具提示字符串,而不需要显示工具提示 无需逐个鼠标放在每个按钮上。 更新1 :对于TTN_NEEDTEXT ,MSDN doc似乎不是很清楚,我不知道如何使用C#编程。 可以在此处找到与工具提示控制相关的低级结构/消息的相关链接之一。 更新2 :那些相信这可以通过……完成的人,我会说,说起来容易做起来难。 我欢迎那些尝试过的人,对此发表评论,如果你能提供一些证据来certificate其适用性和功效,我欢迎一些表面上可行的解决方案。 更新3 :如果我们尝试最小化TTM_SETDELAYTIME以使sleep(N)最小化,则在一些实验之后这不起作用。 我们只能在工具提示窗口句柄存在后进行调整。 例如 SendMessage(_tooltipCtrl.Handle, TTM_SETDELAYTIME, _TTDT_INITIAL, 10); //10 ms 更新4 :使用TTM_GETTEXTA消息似乎是一个解决方案,但是,它类似于Update 3,我们需要tooltipCtrl的句柄,只有在创建工具提示后才可用,因为要创建此工具提示,我们没有选择,但将鼠标光标hover在工具上方,这似乎有如上所述的性能问题( Thread.Sleep )。 SendMessage(_tooltipCtrl.Handle, TTM_GETTEXTA, 0, ti); 更新5 :“如何获取工具提示文本”使用InterOp(PInvoke)或Automation UI使用传统方法(鼠标hover在工具窗口上,找到Hwnd句柄,然后获取其文本…)不是这篇文章的关注点。 预期结果: 我们可以提取控件的工具提示字符串(比如一个按钮)而不需要hover在控件上吗? 如果有,怎么样? 更新6 :使用WM_MOUSEHOVER激活工具提示窗口似乎不起作用,我已经使用SendMessage(…)测试了正确的wparam和lparam填充,但静脉。

LRESULT,WPARAM和LPARAM是什么意思?

我正在导入WinApi函数,在C#中编写回调等( 例子 )并且总是想知道: 他们的意思是什么 ? LRESULT作为最后的结果 ? W-PARAM? L-PARAM? 如何安全地“包裹”它们 WPARAM和LPARAM有时包含结构。 所以我需要将它们用作IntPtr 。 LRESULT怎么样? 我对int或更好的IntPtr安全吗? 我在C#中使用什么类型的LRESULT? int还是IntPtr ?

如何从另一个Windows应用程序获取Chrome 28的当前URL?

在Chrome V27之前,您可以枚举Chrome子窗口控件以进入编辑字段并从那里读取字符串值以获取当前打开的URL。 不幸的是,除了主窗口(Chrome_WidgetWin_1)和网页标签(Chrome_RenderWidgetHostHWND)之外,Chrome 28已经切换到新的渲染引擎(Blink)并且不再使用Windows控件。 如果有人能指出从另一个(Win32)应用程序获取当前打开的Chrome URL的替代方法,我将不胜感激。

将自定义上下文菜单项添加到Windows窗体标题栏

我在MSDN上找到了一个线程 ,它显示了如何将项添加到winform标题栏的上下文菜单中。 不幸的是,它没有显示如何使用自定义菜单项注册事件,我一直无法弄清楚如何做到这一点。 下面是一个示例应用程序,可以将其复制并粘贴到新的Windows窗体应用程序中。 如果有人可以为我完成样品,我将不胜感激。 谢谢 using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); IntPtr hMenu = GetSystemMenu(Handle, false); if (hMenu != IntPtr.Zero) { var menuInfo = new MENUITEMINFO { cbSize = (uint) Marshal.SizeOf(typeof (MENUITEMINFO)), cch = 255, dwTypeData = “Test Item”, fMask […]

从磁盘编号中检索虚拟磁盘文件名

当我在diskpart中列出虚拟磁盘时: DISKPART> list vdisk VDisk ### Disk ### State Type File ——— ——– ——————– ——— —- VDisk 0 Disk 2 Attached not open Fixed C:\Disk.vhd 对我来说有趣的部分是文件名。 如果我知道磁盘号,我试图找到相应的函数,它会给我文件名(在File列下)。 理想情况下,我会给“ \\?\ PhysicalDrive2 ”,我会得到“ C:\ Disk.vhd ”作为结果。 我已经尝试过: 使用diskpart和解析输出 – 因为它是未记录的格式,它可以随时更改。 这不是我所依赖的。 常规VHD API – 没有函数将磁盘号作为参数。 Microsoft.Storage.Vds.dll – 有一些枚举通过每个驱动器(例如Service.Providers),但没有属性/函数可以给我源文件的名称。 虽然我现在可以确定例如驱动器D:是虚拟驱动器,但我仍然无法知道附加了哪个.vhd文件。 知道哪个function可能是什么?

在C#中赢得api。 从IntPtr获取高低字

我试图在C#中处理WM_MOUSEMOVE消息。 从lParam获取X和Y坐标的正确方法是什么?这是一种IntPtr?

使用SendInput自动化按键

当我尝试使用SendInput发送单键按键和组合按键时,我无法让程序按住键盘按钮直到命令被释放。 使用下面的代码,我可以通过首先按下shift来发送字符’a’和’A’ 。 但是,我不能永久地拿着’a’按钮。 public static void KeyDown() { SwitchWindow(Process.GetProcessesByName(“notepad”).FirstOrDefault().MainWindowHandle); INPUT[] inputs = new INPUT[1]; KEYBDINPUT kb = new KEYBDINPUT(); //Set up generic keyboard event inputs[0].type = INPUT_KEYBOARD; kb.wScan = 0; // hardware scan code for key kb.time = 0; kb.dwExtraInfo = IntPtr.Zero; kb.dwFlags = 0; // 0 for key press //Press shift kb.wVk = […]

如何使用C#代码以编程方式单击运行应用程序中的按钮

我想写一个C#程序,它将启动一个.exe(这是一个简单的工作,我知道该怎么做。)但现在我想为它添加更多的function。 我想将用户输入传递给我的程序,并希望将它们作为输入传递给运行.exe。我还要单击exe窗口上可用的特定按钮。 重要的是,我想在没有用户知识的情况下以编程方式执行它,我们实际上在后台运行该exe。 如果有可能请告诉我。 这是非常紧急的。

CopyFileEx“参数无效”错误

我正在编写一个(相当)简单的C#应用​​程序,使用.NET 4在运行可执行文件之前检查更新。 如果网络共享上存在较新版本的exe,只需将其复制到本地文件夹并启动它。 这一切都很完美,除了在阅读File.Copy()的局限性时,我意识到在我这样做时我无法显示进度条,而且我看到的所有内容都说使用CopyFileEx,所以我’我试图这样做。 我使用了这里找到的示例代码并且它编译得很好(尽管我仍然不确定后台工作者是如何发挥作用的),除非我实际去运行应用程序,CopyFilEx()方法返回false,错误是“参数不正确”。 我的代码(仅限相关部分,如果需要,我会添加更多) 调用function: XCopy.Copy(strServerAppPath + strExeName, strLocalAppPath + strExeName, true, true, (o, pce) => { worker.ReportProgress(pce.ProgressPercentage, strServerAppPath + strExeName); }); (源路径的计算结果为“C:\ test.txt”,目标路径为“C:\ test \ test.txt”) 上面链接的代码中出现错误: bool result = CopyFileEx(Source, Destination, new CopyProgressRoutine(CopyProgressHandler), IntPtr.Zero, ref IsCancelled, copyFileFlags); if (!result) throw new Win32Exception(Marshal.GetLastWin32Error()); 在此先感谢您的帮助,我一直在努力解决这个问题几个小时……

从网络摄像头拍摄照片c#

我正在使用DirectShowLib将video流式传输到我的Window窗体。 当我按下“保存”按钮时,我也想保存图像。 如何使用DirectShowLib方法或WIN32 API方法从网络摄像头获取图片?