如何使用C#将按钮添加到另一个应用程序的窗口中

时间:2014-01-10 03:26:02

标签: c# window add

作为标题,我想在另一个应用程序的窗口中添加一个按钮并处理它。

细节是:

  • 我编写了一个在MS窗口上运行的应用程序,当它运行时,它会找到应用程序“Skype”的主窗口。 (因为此任务仅在运行Skype时运行)
  • 如果找到,它会在Skype的主窗口中添加一个按钮。当用户按下它时,我的应用程序将执行某些操作。

我正在使用C#。

非常感谢

1 个答案:

答案 0 :(得分:8)

试试这个(使用Skype for Windows Desktop版本6.11.0.102测试)

public void AttachButtonToSkype() {
  // find skype main window (className = tSkMainForm)
  var mainHandle = NativeMethods.FindWindow("tSkMainForm", null);

  if (mainHandle != IntPtr.Zero) {
    // find child window to inject (className = TMyselfControl)
    var parentHandle = NativeMethods.FindWindowEx(mainHandle, IntPtr.Zero, "TMyselfControl", null);

    if (parentHandle != IntPtr.Zero)
    {          
      var button = new Button { Text = "Click Me!", Left = 150, Top = 5, Width = 75, Height = 25 };
      button.Click += (o, args) => { MessageBox.Show("You've clicked me"); };

      NativeMethods.SetParent(button.Handle, parentHandle);
    }
  }
}

<强> NativeMethods

internal class NativeMethods {
  [DllImport("User32.dll", SetLastError = true)]
  public static extern IntPtr FindWindow(string ClassN, string WindN);

  [DllImport("user32.dll", SetLastError = true)]
  public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

  [DllImport("user32.dll", SetLastError = true)]
  public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
}

提示:使用Spy++查找窗口className