1

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

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

但我无法获得窗口句柄,我试过:

IntPtr Handle = Process.GetCurrentProcess().Handle;

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

4

2 回答 2

1

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

于 2013-04-17T19:20:41.560 回答
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);
    }
}
于 2013-04-17T19:46:59.240 回答