2015-05-01 56 views
0

的標題說明了一切,我有這樣的代碼:重複FindWindow函數每次出現的窗口/打開

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

const UInt32 WM_CLOSE = 0x0010; 

和這裏就是我加入Form1_Load

IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad"); 
      if (windowPtr == IntPtr.Zero) 
      { 
       MessageBox.Show("Window not found"); 
       return; 
      } 

      SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 

所以我添加的代碼上面的Form1_Load函數,它實際上工作,它關閉記事本,當我打開我的程序,但我的問題是,如何使功能重複,如關閉記事本,每當它打開,不僅在Form1_Load

+0

[編寫自動化等待窗口被創建(並解僱它)](http://blogs.msdn.com/b/oldnewthing/archive/2014/02/17/10500645.aspx) – GSerg

+0

@GSerg我試過了,它什麼也沒做,它沒有關閉它,嘗試用記事本,運行和很多其他的... – user3542613

+0

它的運行方式與運行對話框一樣,只要用''Run''字面替換此對話框的標題顯示在您的Windows語言中。對於記事本,由於它沒有此代碼按下的取消按鈕,因此您需要編寫不同的結束代碼。然而,我的觀點是,這是您在創建新窗口時收到通知的方式。您可以使用現有的代碼作爲事件處理程序。 – GSerg

回答

-2

你必須自己枚舉窗口:EnumWindows並在返回程序中檢查標題是否與你想要的相同(硬編碼'無標題'可能不是最好的方式)。或者用GetWindow自己遍歷窗口圖形,從第一個桌面子節點開始,並從那裏迭代兄弟節點。

而且你不需要IntPtr版本的FindWindow,你可以通過null作爲string參數,它實現了相同的。

+0

OP在詢問枚舉必須執行的事件。他們不需要'EnumWindows',因爲他們已經有'FindWindow'。 – GSerg

+0

在什麼事件?我讀他的問題是詢問如何重複關閉多個記事本的功能,而不僅僅是第一個。 – Blindy

+0

他們關閉所有筆記本。然後用戶打開另一個記事本。他們也想關閉它。 – GSerg