请高手帮忙,万分着急。

解决方案 »

  1.   

    一个WinForm程序,启动时,通过如下代码判断,如果没有实例运行,则Application.Run(new   MainForm());启动实例,如果已经有一个实例在运行,则得到已经运行的实例句柄(已保存),激活它,不再启动新实例。 问题就是,我第二次启动实例的时候,如果能把一个参数传给已经启动的实例(设置到实例的成员变量中去)??   求高人指点。 
    //   Check   one   form 
                            if   (hMutex.WaitOne(0,   false)) 
                            { 
                                    Application.Run(new   MainForm()); 
                            } 
                            else 
                            { 
                                    //Set   foreground   window 
                                    IntPtr   mHandle   =   (IntPtr)Convert.ToInt32(ReadRegisterKey(MAINFORM_HANDLEKEY)); 
                                    ShowWindow(mHandle,   5); 
                                    SetForegroundWindow(mHandle); 
                            }
      

  2.   

    try
    System.IntPtr handler = ....
    Form f1 = (Form)Form.FromHandler(handler)
      

  3.   

    用Control.FromHandle取回Control的实例,然后再强转或反射,可以解决吗?
      

  4.   

    Form   f1   =   (Form)Form.FromHandler(handler) 得到f1后,怎么看不到它里面的成员变量啊??
      

  5.   

    我的这个程序本来就是一个winform程序,只有一个类WinForm的,我想只创建启动一个窗体。
      

  6.   

    楼主的做法非常低效,不可靠。
    先用Process.GetProcessesByName然后
    用Process.MainWindowHandle就可以了。
      

  7.   

    楼上的兄弟们,不管如何取得handle,我的handle已经取到了,我只想搞清楚如何根据handle给winform的实例成员变量设值???
      

  8.   

    唉。你赋什么实例成员?直接用Win32函数,SetForgroundWindow不就结了。
      

  9.   

    如下试试看:
    WinForm frm = Control.FromHandle(mHandle) as WinForm;
    if (frm != null)
    {
        //这里你可以操作任何一个你的WinForm类的成员,甚至私有成员。当然你可以按你的思路使用如下的两个语句
        ShowWindow(mHandle,       5);   
        SetForegroundWindow(mHandle);   
    }
      

  10.   

    比如你的WinForm里有一个如下的声明的变量成员:
    private int flag;你可以这样来访问:WinForm frm = Control.FromHandle(mHandle) as WinForm;
    if (frm != null)
    {
       frm.flag = 100;
    }
      

  11.   

    lz可以参考: http://www.codeproject.com/KB/cs/singleinstanceapplication.aspx
      

  12.   

    还有hbxtlhx  你的那方法是不可能成功的,你别忘了,你获得的那个句柄是另一个进程中的。它完全有可能是一个Win32的窗口,不管是不是Win32窗口,也不可能就这样通过一个句柄就转换成一个Form对象。。楼主:对你的应用HWND就足够了。无需获取Form,也无法获取。
      

  13.   

    使用Control.FromHandle当然是有条件,首先一定是要本进程内的,第二如果是CreateWindow那样建的Win32窗口,当然不可能的。
      

  14.   

    我是忽视了个问题,确实Control.FromHandle获取其它进程的名柄是不能成功的。
    我的方法无效。
      

  15.   

    haiwangstar 对你的应用HWND就足够了。无需获取Form,也无法获取。那我如何根据hwnd设置实例成员变量的值啊,现在关键问题是这个啊
      

  16.   

    做不到。要么你就要用TCP/ip ,PIPE,Remoting,SHARE MEMORY,COM+,IPC等等等等。进程通信技术。
      

  17.   

    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow
     (string sClassName,
      string sWindowTitle);provite bool theInstanceExists(string className,stringTitle)
    {
    IntPtr win = FindWindow("类名", "标题栏");
    if(win.Equals(IntPtr.Zero))
    {
      return false;
    }
    else
    {
      //有一个实例在运行了. win 就是这个实例的句柄
      return true;
    }
    }
      

  18.   

    如果在指定范围内查找,请使用 FindWindowEx
      

  19.   

    Process.GetProcessesByName
    Process.StandardInput
    这样就可以往你的程序里传数据了。