如何在C#中使用SendMessageTimeout获取窗口标题
发布时间:2020-12-16 01:37:55 所属栏目:百科 来源:网络整理
导读:我需要枚举所有打开的窗口并获取它们的标题,但问题是某些窗口属于同一个进程,但属于另一个被阻塞的线程(等待互斥锁).因此,我不能将GetWindowText用于属于我自己进程的窗口,因为这将导致SendMessage调用,这将阻止我的代码执行(因为它将等待被阻塞线程的relpy)
我需要枚举所有打开的窗口并获取它们的标题,但问题是某些窗口属于同一个进程,但属于另一个被阻塞的线程(等待互斥锁).因此,我不能将GetWindowText用于属于我自己进程的窗口,因为这将导致SendMessage调用,这将阻止我的代码执行(因为它将等待被阻塞线程的relpy).
顺便说一下,这是一篇关于GetWindowText如何在内部工作的有趣文章:http://blogs.msdn.com/b/oldnewthing/archive/2003/08/21/54675.aspx 作为一个解决方案决定使用SendMessageTimeout到窗口,以检索其标题,但我无法使其工作.我在做的是: [DllImport("User32.dll")] public static extern int SendMessageTimeout( IntPtr hWnd,int uMsg,int wParam,int lParam,int fuFlags,int uTimeout,out StringBuilder lpdwResult); ... StringBuilder sb = new StringBuilder(256); int result = Win32API.SendMessageTimeout( hWnd,0x0D /*WM_GETTEXT*/,256,10 /*SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG*/,500,out sb); 但我总是得到0表示函数失败,而sb总是为空. 解决方法
您需要在lParam中传递字符串缓冲,而不是在lpdwResult中传递. lpdwResult可以是NULL或Int32,它包含消息处理的结果.请注意,SendMessageTimeout无助于获取非响应窗口的标题,但会阻止调用方阻止.
编辑:有趣的是,SendMessageTimeout的PInvoke声明取决于您要发送的消息.在必须在同一程序中发送不同消息的情况下,我认为可以使多个PInvoke声明调用相同的API. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |