[DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern int FindWindow(string lpClassName, string lpWindowName);
我的窗体是无边框风格,我以为只要设置了其Text属性,FindWindow就没问题,但运行发现不行。通过类名吗?我的窗体运行中需要创建很多个,每一个单独设置一个窗口类?如果FindWindow不行,还有哪些进程间通信的方法,小弟用来传递的数据极小,只求速度越快越好。求各位给一个办法,谢谢!

解决方案 »

  1.   

    1.使用Process.GetProcessByName获取Process对象。
    2.使用Process对象的MainWindowHandle获取该进程的主窗口句柄。
    3.使用SendMessage函数给该窗口发消息。只是设想,未经验证。
      

  2.   

    GetProcessByName返回的是一个数组,可以逐一检查这个数组的成员。
    如果你能获得进程ID的话,也可以使用GetProcessById
      

  3.   

    感谢各位回复,不过测试过程令人失望。我根据进程ID获取到了进程,但由于进程里的主窗口是无边框类型,导致Process.CloseMainWindow 、SendMessage这些方法统统失效。唯一起作用的是Kill方法。但这个太过简单粗暴了。大家还有啥办法啊?
      

  4.   

    FindWindow应该是和有无边框风格没关系,我有个程序就是无边框风格但能找到,主要问题好像是窗口.show(),不要用showdialogue();
      

  5.   

    我的窗口是程序主窗口,它即不是show出来的,也不是showdialog出来的,它是Application.Run(new iNotePage());这样出来的。我测试了好几遍,只要弄上边框,就能收到消息,设为无边框类型,那这个窗口貌似就不存在了。连SPY++都看不到(只能看到里面控件)。无法完成进程通信。我现在采取办法是设了个定时器,通过共享内存来完成进程间通信
      

  6.   

    如果你能从文件名来判断。可以考虑foreach (Process p in Process.GetProcesses())
    {
        if (Path.GetFileNameWithoutExtension(p.StartInfo.FileName) == "你说的文件名")
        {
            Console.WriteLine(p.MainWindowHandle.ToInt32());
        }
    }