2015-05-01 52 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