★★★一个winform程序,运行后,知道了其句柄,如何根据其句柄给实例的成员变量设值???★★★ 请高手帮忙,万分着急。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一个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); } trySystem.IntPtr handler = ....Form f1 = (Form)Form.FromHandler(handler) 用Control.FromHandle取回Control的实例,然后再强转或反射,可以解决吗? Form f1 = (Form)Form.FromHandler(handler) 得到f1后,怎么看不到它里面的成员变量啊?? 我的这个程序本来就是一个winform程序,只有一个类WinForm的,我想只创建启动一个窗体。 楼主的做法非常低效,不可靠。先用Process.GetProcessesByName然后用Process.MainWindowHandle就可以了。 楼上的兄弟们,不管如何取得handle,我的handle已经取到了,我只想搞清楚如何根据handle给winform的实例成员变量设值??? 唉。你赋什么实例成员?直接用Win32函数,SetForgroundWindow不就结了。 如下试试看:WinForm frm = Control.FromHandle(mHandle) as WinForm;if (frm != null){ //这里你可以操作任何一个你的WinForm类的成员,甚至私有成员。当然你可以按你的思路使用如下的两个语句 ShowWindow(mHandle, 5); SetForegroundWindow(mHandle); } 比如你的WinForm里有一个如下的声明的变量成员:private int flag;你可以这样来访问:WinForm frm = Control.FromHandle(mHandle) as WinForm;if (frm != null){ frm.flag = 100;} lz可以参考: http://www.codeproject.com/KB/cs/singleinstanceapplication.aspx 还有hbxtlhx 你的那方法是不可能成功的,你别忘了,你获得的那个句柄是另一个进程中的。它完全有可能是一个Win32的窗口,不管是不是Win32窗口,也不可能就这样通过一个句柄就转换成一个Form对象。。楼主:对你的应用HWND就足够了。无需获取Form,也无法获取。 使用Control.FromHandle当然是有条件,首先一定是要本进程内的,第二如果是CreateWindow那样建的Win32窗口,当然不可能的。 我是忽视了个问题,确实Control.FromHandle获取其它进程的名柄是不能成功的。我的方法无效。 haiwangstar 对你的应用HWND就足够了。无需获取Form,也无法获取。那我如何根据hwnd设置实例成员变量的值啊,现在关键问题是这个啊 做不到。要么你就要用TCP/ip ,PIPE,Remoting,SHARE MEMORY,COM+,IPC等等等等。进程通信技术。 [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;}} 如果在指定范围内查找,请使用 FindWindowEx Process.GetProcessesByNameProcess.StandardInput这样就可以往你的程序里传数据了。 获取报表纸张格式 【求教】如何在C#中调用Winrar库函数对一个文件进行解压缩(详细需求见内) 同步异步 取文件目录的问题 关于C#中窗体切换的问题 请问个图形编辑方面的问题 求教!这种图片的浏览方式该怎么实现的? InitializeComponent()帮忙改错 C#中的所有文字。 请问各位大虾一个关于流加密的问题 非常感谢!cansum396 vs2005 ,全程建模????
// 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);
}
System.IntPtr handler = ....
Form f1 = (Form)Form.FromHandler(handler)
先用Process.GetProcessesByName然后
用Process.MainWindowHandle就可以了。
WinForm frm = Control.FromHandle(mHandle) as WinForm;
if (frm != null)
{
//这里你可以操作任何一个你的WinForm类的成员,甚至私有成员。当然你可以按你的思路使用如下的两个语句
ShowWindow(mHandle, 5);
SetForegroundWindow(mHandle);
}
private int flag;你可以这样来访问:WinForm frm = Control.FromHandle(mHandle) as WinForm;
if (frm != null)
{
frm.flag = 100;
}
我的方法无效。
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;
}
}
Process.StandardInput
这样就可以往你的程序里传数据了。