WinForms:在Application.Run(new Form1())之前有办法获得窗口句柄吗?

时间:2013-04-17 19:03:17

标签: c# winforms process handle

我有一个winforms,在Application.Run之前(新的Form1())我向其他应用发送消息

[DllImport("user32.dll")]
public static extern long SendMessage(IntPtr Handle, int Msg, int wParam, int lParam);

但我无法获得窗口处理,我试过了:

IntPtr Handle = Process.GetCurrentProcess().Handle;

但有时它会回归错误的手柄 我怎样才能做到这一点?非常感谢你!

2 个答案:

答案 0 :(得分:1)

如果您尝试向不同的应用程序发送消息,则需要获取窗口句柄,而不是属于您自己进程的窗口句柄。使用Process.GetProcessesByName查找特定进程,然后使用MainWindowHandle属性获取窗口句柄。请注意MainWindowHandleHandle不同,因为后者指的是进程句柄而不是窗口句柄。

答案 1 :(得分:1)

SendMessage函数的第一个参数是将接收消息的窗口的句柄。 Process.GetCurrentProcess().Handle返回当前进程的本机句柄。这不是一个窗口句柄。

Application.Run启动应用程序的消息循环。 由于您希望将消息发送到另一个应用程序,因此您的应用程序根本不需要消息循环。但是,您需要处理其他应用程序窗口的句柄。

以下示例显示如何使用SendMessage关闭其他应用的主窗口:

[DllImport("user32.dll")]
public static extern long SendMessage(IntPtr Handle, int Msg, int wParam, int lParam);

public const int WM_CLOSE = 0x0010;

private static void Main()
{
    var processes = Process.GetProcessesByName("OtherApp");
    if (processes.Length > 0)
    {
        IntPtr handle = processes[0].MainWindowHandle;
        SendMessage(handle, WM_CLOSE, 0, 0);
    }
}