我目前正在制作一个应用程序来帮助我测试另一个单独的应用程序(两者都是用VB.NET制作的)。我希望我的测试版应用程序能够在我的其他应用程序中以表格形式输入信息。由于我熟悉这两个应用程序,因此我知道我希望在我的testee应用程序上执行操作的表单的名称和所有内容。我的问题是,我需要一种方法来使用受试者表单的这些信息来获取一个句柄或者我可以在我的测试者应用程序的代码中实际引用该表单的东西。
我怎样才能获得此表格?我对类似事物的唯一体验是获取进程主窗口的句柄,但这样做更容易:
Dim iTunesID as intptr
for each process as process in process.getprocesses
if proc.mainwindowtitle = "iTunes" then iTunesID = proc.MainwindowHandle
next
然而即使我并不满意,因为它需要遍历每个过程。即便如此,我也不确定如何引用我的特定窗口,因为在这种情况下它不是主窗口。我已经尝试过搜索如何执行此操作,但我认为我的搜索有点过于模糊,因为我不知道可以使用哪些方法来执行此操作或协助执行此操作。
我的第一个想法是类似于上面的东西,但有一些类似“为每个表单作为forms.form in'forms.formsrunning'”之类的东西,但我甚至不知道一个命令来运行表单,虽然我想我可能找到一个,我希望有一个比迭代所有进程/表单更好的解决方案。
提前感谢您的帮助! :)
答案 0 :(得分:1)
如果我正确地回答了您的问题,以下VB.NET代码片段可能会有所帮助:
Dim procNameSought As String = "Notepad2"
'
' Use LINQ to get the Process ID for the Application whose window should
' be brought into focus if you don't already have the Process ID...
'
Dim processID As Integer = (From proc As Process In Process.GetProcesses
Where proc.ProcessName.Trim() = procNameSought
Select proc.Id).FirstOrDefault()
'
' Use AppActivate to bring the Main Window for the Process into Focus....
'
Microsoft.VisualBasic.AppActivate(processID)
如果应用程序的主窗口未最小化到任务栏, (例如,主窗口被另一个应用程序隐藏),它将被带来 到前台并有焦点。但是,如果进程的主窗口有 被最小化到任务栏,你可能需要看看使用PInvoke来调用 Windows API函数SetActiveWindow (http://msdn.microsoft.com/en-us/library/ms939986.aspx)。
caeasy的解释包括如何做到这一点的一种方法: Correct way (in .NET) to switch the focus to another application
对于使用SetActiveWindow(),您需要指定您尝试设置焦点的Windows句柄的实例,可以通过以下调用获得:
'
' 32-Bit Window Handle : You may need to change this over to Int64 if
' you're running on a 64-Bit OS...
'
Dim windowHandle As Int32 = (From proc As Process In Process.GetProcesses
Where proc.ProcessName.Trim() = procNameSought
Select proc.MainWindowHandle).FirstOrDefault()
Dim winHandlePtr As New IntPtr(windowHandle)
我希望这有帮助和兴趣...
答案 1 :(得分:0)
如果你有时间,可以看看Hawkeye来源(http://hawkeye.codeplex.com/) 这是一个开源实用程序,用于连接到正在运行的.Net应用程序,并更改属性值,调用方法等...
Hawkeye通过点击操作实际连接到正在运行的应用程序。
你可以在现有流程上使用循环找到正在运行的应用程序,然后你可以使用Hawkeye源代码中的一些技巧来挂钩这个应用程序并开始更改值,调用方法等......