c# 通过Process 如何获取到当前运行窗体的实例

lihui_life 2015-10-21 11:47:24
需求是这样的, 我用winform做了一个壳,内部嵌套一个谷歌浏览器,现在通过点击页面的一个按钮触发了一个 winform 的弹窗,并做成模态窗体,但是弹出来后是获取不到父窗体的,所以想要获取到他的父窗体并设置给新弹出的窗体,想到Process来做,现在用 IntPtr handle = FindWindow(null, "form1"); 拿到了IntPtr ,接下来怎么获取他的实例呢? 还有就是这种方法能完成模态窗体吗?
...全文
1688 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihui_life 2015-10-22
  • 打赏
  • 举报
回复
这种方法我试过, 报错的“System.InvalidOperationException”类型的异常在 System.Windows.Forms.dll 中发生,但未在用户代码中进行处理 其他信息: 线程间操作无效: 从不是创建控件“MainForm”的线程访问它
引用 13 楼 ajianchina 的回复:
引用 10 楼 lihui_life的回复:
在一个AppDomain的, 你那个具体怎么搞? [quote=引用 9 楼 ajianchina 的回复:] 父子窗体是在同一个AppDomain吗?如果是的,我前面说的那个方法应该是可行的,或者通过弹窗的构造函数,在业务代码中子窗体实例化阶段将其直接传给弹窗这也应该是可行的。
其实我前面说的就是过程啊,不难理解的啊,不知道你的代码到底是怎么写的,你说是从你的业务代码里调用,我看你的问题就是在于子窗体实例化的时候如何找到你的那个form1实例。这样吧,弄个最简单的,用静态变量也行啊:

//父窗体form1 中这样写
public partial class Form1 : Form
{
	public static Form frm1;
	public Form1()
	{
		InitializeComponent();
		frm1 = this;
	}
}

//子窗体中取form1就是:
string formName =  ((Form1)Form1.frm1).Name;
[/quote]
lihui_life 2015-10-21
  • 打赏
  • 举报
回复
或者有其他办法能实现吗?
引用 1 楼 wyd1520 的回复:
实例 拿 不到吧
本拉灯 2015-10-21
  • 打赏
  • 举报
回复
实例 拿 不到吧
ajianchina 2015-10-21
  • 打赏
  • 举报
回复
引用 10 楼 lihui_life的回复:
在一个AppDomain的, 你那个具体怎么搞?
引用 9 楼 ajianchina 的回复:
父子窗体是在同一个AppDomain吗?如果是的,我前面说的那个方法应该是可行的,或者通过弹窗的构造函数,在业务代码中子窗体实例化阶段将其直接传给弹窗这也应该是可行的。
其实我前面说的就是过程啊,不难理解的啊,不知道你的代码到底是怎么写的,你说是从你的业务代码里调用,我看你的问题就是在于子窗体实例化的时候如何找到你的那个form1实例。这样吧,弄个最简单的,用静态变量也行啊:

//父窗体form1 中这样写
public partial class Form1 : Form
{
	public static Form frm1;
	public Form1()
	{
		InitializeComponent();
		frm1 = this;
	}
}

//子窗体中取form1就是:
string formName =  ((Form1)Form1.frm1).Name;
lihui_life 2015-10-21
  • 打赏
  • 举报
回复
这个要具体怎么使用呢? 有简单的调用代码吗?
引用 11 楼 dongxinxi 的回复:
dlg.ShowDialog(this); 在模态窗体中用this.Ownner就可以取到父窗体了 如果是非托管的,可以调用API HWND GetParent(HWND hWnd)
  • 打赏
  • 举报
回复
dlg.ShowDialog(this); 在模态窗体中用this.Ownner就可以取到父窗体了 如果是非托管的,可以调用API HWND GetParent(HWND hWnd)
lihui_life 2015-10-21
  • 打赏
  • 举报
回复
在一个AppDomain的, 你那个具体怎么搞?
引用 9 楼 ajianchina 的回复:
父子窗体是在同一个AppDomain吗?如果是的,我前面说的那个方法应该是可行的,或者通过弹窗的构造函数,在业务代码中子窗体实例化阶段将其直接传给弹窗这也应该是可行的。
ajianchina 2015-10-21
  • 打赏
  • 举报
回复
父子窗体是在同一个AppDomain吗?如果是的,我前面说的那个方法应该是可行的,或者通过弹窗的构造函数,在业务代码中子窗体实例化阶段将其直接传给弹窗这也应该是可行的。
lihui_life 2015-10-21
  • 打赏
  • 举报
回复
我浏览器内核封装的是 谷歌浏览器,调用了他的RegisterJsObject 方法向浏览器注入了方法调用,他可以直接调用c#业务代码。我的这个调用了一个弹窗,由于是在页面上激发的, 所以获取不到父窗体,而我需要这个窗体是模态的窗体,所以需要找办法解决获取到这个父窗体
引用 7 楼 ajianchina 的回复:
你是怎么激发的呢,我倒挺感兴趣。
ajianchina 2015-10-21
  • 打赏
  • 举报
回复
你是怎么激发的呢,我倒挺感兴趣。
lihui_life 2015-10-21
  • 打赏
  • 举报
回复
这个窗体是通过 浏览器 激发弹窗的, 所以获取不到啊
引用 5 楼 ajianchina 的回复:
你怎么会获取不到父窗体呢? ShowDialog之前,将子窗体的Owner指向this,随后子窗体的this.Owner这样难得取不到?
ajianchina 2015-10-21
  • 打赏
  • 举报
回复
你怎么会获取不到父窗体呢? ShowDialog之前,将子窗体的Owner指向this,随后子窗体的this.Owner这样难得取不到?
lihui_life 2015-10-21
  • 打赏
  • 举报
回复
拿到实例把他设为新弹窗的父窗体,实现新弹窗是模态窗体
引用 3 楼 wyd1520 的回复:
你拿实体做啥。
本拉灯 2015-10-21
  • 打赏
  • 举报
回复
你拿实体做啥。

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧