当前位置: 首页 > 编程语言 > C#

PinvokeSetFocus到特定控件分享

时间:2023-04-11 02:46:36 C#

PinvokeSetFocus到特定控件简单问题:是否可以将焦点设置在另一个应用程序中的文本框(使用其ClassName)。我有窗口作为“intptr”等等,但只需要一些关于哪些功能/API可用的指导!问题是,我使用SetForegroundWindowAPI获取窗口焦点,但它不会让我发送Ctrl+L键来聚焦文本框!任何帮助都会很棒!...据我所知,这是我必须用来完成这项工作的代码——这在我的应用程序和较新的Windows等上运行良好。voidSetFocus(IntPtrhwndTarget,stringchildClassName){//hwndTarget是另一个应用程序的主窗口//...IntPtrtargetThreadID=WindowsAPI.GetWindowThreadProcessId(hwndTarget,IntPtr.Zero);//目标线程idIntPtrmyThreadID=WindowsAPI.GetCurrentThread();//调用线程id,我们的线程idtry{boollRet=WindowsAPI.AttachThreadInput(myThreadID,targetThreadID,-1);//将当前线程ID附加到目标窗口//如果它不在前台...lRet=WindowsAPI.BringWindowToTop(hwndTarget);WindowsAPI.SetForegroundWindow(hwndTarget);//如果您知道子win类名,请执行以下操作(再次使用WinAPI枚举窗口)...varhwndChild=EnumAllWindows(hwndTarget,childClassName).FirstOrDefault();if(hwndChild==IntPtr.Zero){//或者使用键盘等来聚焦,即发送键/输入...//SendInput(...);返回;}//你也可以在这里使用编辑控件的hwnd或一些(目标的)子窗口WindowsAPI.SetFocus(hwndChild);//hwnd目标);}最后{boollRet=WindowsAPI.AttachThreadInput(myThreadID,targetThreadID,0);//从前景窗口分离}}...所以按照这些行做一些事情(它做你需要的按正确的顺序做,不要忘记分离等-但你需要根据你的具体情况进行调整,control/edithwnd等-你可能有其他目标窗口/应用程序相关的问题,这适用于大多数情况,但并非在所有情况下,这是一个很长的故事,正如我所说,取决于你的具体情况),(WindowsAPI是我认为典型的PInvoke包装器)基本上你需要附加到另一个线程来执行“输入”操作,我相信这是官方解释“这也允许线程共享它们的输入状态,因此它们可以调用SetFocus函数来设置键盘从不同的线程聚焦到一个窗口”谷歌的AttachThreadInput了解更多信息(了解原因),它也经常与SetFocus和其他输入/键盘操作相关联。此外,AutomationAPI可以提供帮助——这是“最干净”的方式——但取决于目标应用程序是否被正确公开和处理——对于大多数人来说仍然是“不存在的”、不一致的等等——如果你想处理不同于你的“自己的”应用程序”,你需要问自己什么是最好的解决方案等希望这有帮助注意:必须有十几个类似解决方案的链接(以及SO),因为这是一个众所周知的编辑:我澄清了你的具体案例和儿童焦点编辑(2):该代码是本规范的示例。案例和基于工作代码-但可能需要测试和计算出一些细节(这似乎超出了这个问题的范围),例如..WindowsAPI包含WindowsAPI和本机调用的PInvoke签名(类似于MS.Win32.UnsafeNativeMethods),它是一个静态类(请参阅该类或http://pinvoke.net/-也可以访问Microsoft.Win32.UnsafeNativeMethods?),名为(安全/不安全)NativeMethods(http://msdn.microsoft.com/en-us/library/ms182161.aspx)-还请参阅IntPtr、SafeHandle和HandleRef-解释(IntPtr有点“旧”风格)EnumAllWindows使用EnumChildWindows和GetClassNameWinAPI(我猜这是另一个问题)并且需要包装方法需要使其有用(EnumAllWindows是-它只是通过递归检查类名来枚举窗口)。以上就是C#学习教程:PinvokeSetFocus给具体控件分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: