2012-01-13 26 views
2

我記錄了這個宏,重視對我的過程(nunit.exe)的按鈕。現在我想在我附加的過程的窗口上按下一個按鈕(名爲「運行」),但是如何?我記錄了這個宏:怎麼按上一個不同的進程(nunit.exe)

Sub DebugNUnit() 
DTE.ExecuteCommand("Tools.ExternalCommand6") 
'need a short delay for nunit process to appear in process list: 
Threading.Thread.Sleep(200) 

Try 

    Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger 

    Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default") 

    Dim dbgeng(1) As EnvDTE80.Engine 

    dbgeng(0) = trans.Engines.Item("Managed (v4.0)") 

    Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "myPC").Item("nunit.exe") 

    proc2.Attach2(dbgeng) 

Catch ex As System.Exception 

    MsgBox(ex.Message) 

End Try 
End Sub 

更新:我具有基於這樣回答

Sub DebugNUnit() 
    DTE.ExecuteCommand("Tools.ExternalCommand6") 
    'need a short delay for nunit process to appear in process list: 
    Threading.Thread.Sleep(200) 

    Try 

     Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger 

     Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default") 

     Dim dbgeng(1) As EnvDTE80.Engine 

     dbgeng(0) = trans.Engines.Item("Managed (v4.0)") 

     Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "myPC").Item("nunit.exe") 

     proc2.Attach2(dbgeng) 

     'added this because we may need a short delay for nunit gui to load 
     '(would prefer to replace it with a wait on some loaded event or something) 
     Threading.Thread.Sleep(5000) 

     'use Process.Handle or Process.MainWindowHandle? anyway, both do not seem to work.. are the parameters incorrect? 
     Dim ButtonHandle As IntPtr = FindWindowEx(System.Diagnostics.Process.GetProcessById(proc2.ProcessID).Handle, 0, "Button", "Run") 
     'Dim ButtonHandle As IntPtr = FindWindowEx(System.Diagnostics.Process.GetProcessById(proc2.ProcessID).MainWindowHandle, 0, "Button", "Run") 

     SendMessage(ButtonHandle, &HF5, 0, 0) 

    Catch ex As System.Exception 

     MsgBox(ex.Message) 

    End Try 

End Sub 

但推出NUnit的用戶界面上的「運行」按鈕(調整腳本通過Tools.ExternalCommand6)仍然沒有被按下。這是有道理的,因爲按鈕手柄似乎總是0 ..爲什麼?有沒有人有解決方案?

更新:我已經調整基於這樣

Option Strict Off 
Option Explicit Off 
Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports EnvDTE90 
Imports EnvDTE90a 
Imports EnvDTE100 
Imports System.Diagnostics 
Imports System.Runtime.InteropServices 
Imports System.Windows.Forms 

Public Module RecordingModule 

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
    Private Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean 
End Function 

Sub DebugNUnit() 
    DTE.ExecuteCommand("Tools.ExternalCommand6") 
    'need a short delay for nunit processes to appear in process list: 
    Threading.Thread.Sleep(1000) 

    Try 

     Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger 
     Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default") 
     Dim dbgeng(1) As EnvDTE80.Engine 
     dbgeng(0) = trans.Engines.Item("Managed (v4.0)") 
     Dim proc2nunitagent As EnvDTE80.Process2 = dbg2.GetProcesses(trans, Environment.MachineName).Item("nunit-agent.exe") 
     Dim proc2nunit As EnvDTE80.Process2 = dbg2.GetProcesses(trans, Environment.MachineName).Item("nunit.exe") 
     proc2nunitagent.Attach2(dbgeng) 

     PostMessage(System.Diagnostics.Process.GetProcessById(proc2nunit.ProcessID).MainWindowHandle, &H100, Keys.Alt Or Keys.R, IntPtr.Zero) 

    Catch ex As System.Exception 

     MsgBox(ex.Message + Environment.NewLine + ex.StackTrace) 

    End Try 

End Sub 
End Module 

我使用NUnit 2.5.7編輯的答案,用於連接和調試腳本工作,你需要附加到NUnit的代理和在nunit gui上運行,可以附加到nunit gui的更新版本的nunit。

上面的腳本使NUnit的調試從只有Visual Studio和NUnit的二進制文件的Visual Studio IDE中。您只需將nunit設置爲外部工具(將當前項目作爲參數),創建自定義工具欄,然後將按鈕添加到使用上述腳本的工具欄中。這將啓動nunit,附加到它,開始運行測試,並在您的斷點處斷開。

還有一件事:在nunit gui中,在Tools - > Settings - > Tree Display中禁用「Save Visual state of each Project」,或者nunit gui會記住最後一次運行測試,如果那不是那個你想調試。

可能的改進:建造開始之前NUnit的。

+0

如果你只是想調試你的單元測試,我建議你得到像TestDriven.NET或ReSharper的東西。它們都允許您輕鬆地在Visual Studio中調試您的測試。 – 2012-01-16 09:58:49

+0

我對這些工具很熟悉,但它們不是免費軟件,像VisualNUnit這樣的免費軟件工具不夠可靠。除此之外,我快到了......我現在需要的是按鈕句柄,而且我有自己的自定義工具欄,並帶有一個按鈕,該按鈕爲當前項目啓動NUnit,附加到它,運行測試並斷開我的斷點。 – mtijn 2012-01-16 10:04:54

+0

Visual NUnit是開源的,與免費軟件相對;你總是可以修復它...? – 2012-01-16 11:37:37

回答

4

試試這個:

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> 
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr 
End Function 
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> 
Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal lclassName As String, ByVal windowTitle As String) As IntPtr 
End Function 

Dim ButtonHandle As IntPtr = FindWindowEx(YOURPROCESS.HANDLE, 0, "Button", "&Run") 
SendMessage(ButtonHandle, &HF5, 0, 0) 

編輯:好像NUint是一個.NET應用程序,這意味着你不能得到的按鈕輕鬆處理。你可以在Spy ++的幫助下看到自己。

我注意到RunALT + R鍵盤快捷鍵所以不是你可以使用此代碼:

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> 
Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean 
End Function 
PostMessage(MAIN_WINDOW_HANDLE, &H100, Keys.Alt Or Keys.R, IntPtr.Zero) 

我測試這和它工作正常。

+0

這完全是真棒,謝謝!但現在如何獲得nunit.exe的進程句柄?我已經有了它的EnvDTE80.Process2對象,但似乎沒有任何用處。 – mtijn 2012-01-16 08:22:40

+0

nunit.exe是NUnit GUI的過程。看到我的問題,我已經用最新的結果更新了它。 – mtijn 2012-01-16 09:43:54

+0

正是我所需要的,我已經在問題中發佈了最終結果。 – mtijn 2012-01-17 09:41:31

相關問題