我有一个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;
但有时它会回归错误的手柄 我怎样才能做到这一点?非常感谢你!
答案 0 :(得分:1)
如果您尝试向不同的应用程序发送消息,则需要获取其窗口句柄,而不是属于您自己进程的窗口句柄。使用Process.GetProcessesByName
查找特定进程,然后使用MainWindowHandle
属性获取窗口句柄。请注意MainWindowHandle
与Handle
不同,因为后者指的是进程句柄而不是窗口句柄。
答案 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);
}
}