首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C#中使用线程时,窗体不会在父窗体的中心打开

是因为在多线程环境下,窗体的位置设置需要在UI线程中进行,而不是在后台线程中进行。这是因为UI元素只能在创建它们的线程上进行操作。

为了解决这个问题,可以使用委托和Invoke方法来确保在UI线程中设置窗体的位置。具体步骤如下:

  1. 在主窗体的代码中,定义一个委托类型,用于在UI线程中设置子窗体的位置。例如:
代码语言:csharp
复制
delegate void SetFormPositionDelegate(Form form);
  1. 在创建子窗体的代码中,使用Invoke方法调用委托来设置子窗体的位置。例如:
代码语言:csharp
复制
private void OpenChildForm()
{
    ChildForm childForm = new ChildForm();
    childForm.StartPosition = FormStartPosition.CenterScreen;

    if (this.InvokeRequired)
    {
        this.Invoke(new SetFormPositionDelegate(SetFormPosition), childForm);
    }
    else
    {
        SetFormPosition(childForm);
    }

    childForm.Show();
}

private void SetFormPosition(Form form)
{
    form.StartPosition = FormStartPosition.CenterScreen;
}

在上述代码中,OpenChildForm方法用于创建并显示子窗体。在创建子窗体之前,先设置子窗体的StartPosition属性为FormStartPosition.CenterScreen,表示在父窗体的中心打开。然后通过判断当前线程是否为UI线程来决定是否使用Invoke方法调用委托。

  1. 运行代码,子窗体将会在父窗体的中心打开。

需要注意的是,使用多线程时需要谨慎处理线程间的同步和访问共享资源的问题,以避免出现竞态条件和死锁等问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#窗体调用窗体方法(或多窗体之间方法调用)

C#窗体调用窗体方法(或多窗体之间方法调用) 看似一个简单功能需求,其实很多初学者处理不好,很多朋友会这么写: C# Code: //窗体是是frmParent,子窗体是frmChildA...//窗体打开窗体 frmChildA child = new frmChildA(); child.MdiParent = this; child.Show(); //子窗体窗体方法...错强依赖!如果窗体与子窗体同一个模块内看似没有错,因为这种反向引用在同一个模块内是可行,但程序不能这么写,你把它写死了!固化了!...假设我们项目不断扩展,需要将窗体与子窗体分开在不同模块,这段代码就完了!因为窗体模块必须引用子窗体模块,而子窗体需要用到frmParent类,又要引用窗体模块!...办法是有的,就是使用接口解除依赖关系!

8.1K20

C#记事本项目开发,一个可以实现批量操作记事本!【附源码】

同样和之前大灰狼和大家分享计算器项目一样,记事本项目也可以使用很多不同语言开发,今天大灰狼就先和大家介绍一下使用C#开发记事本思路和流程。...C#记事本开发需要我们定义两个窗体,也就是一个承载所有记事本窗体,一个具有记事本基本功能窗体。 . 记事本子窗体 所以我们首先来聊一下具有记事本基本功能窗体开发。...C#窗体应用,我们可以直接对界面进行控件布局,不需要使用代码定义控件,在这一点上C#窗体应用开发是很不错。..., "警告"); } } 打开文件控件函数: 进行文件打开操作,我们需要对所打开文件进行筛选,只要求打开txt格式文本文件即可。...主控页面窗体 接下来就是承载记事本编辑窗口窗体了。 窗体需要包括控件有记事本新建、关闭、全部关闭、退出等。

1.9K10

使用C++实现仿Wallpaper动态壁纸软件(含源文件)

在上一篇博客,已经介绍了wallpaper实现原理,并用C#实现,本文将使用C++和Qt框架实现,由于之前已经介绍过具体思路,本文将跳过分析过程,直接上代码。...Maneger,所以只要 //遍历所有workW类型窗体,逐一比较它窗体是不是Program Manager就可以找到背景窗体 HWND hwnd = FindWindowA("...= NULL); return NULL; } C#制作动态壁纸软件,我专门为刷新背景做了一个exe文件,因此这里可以直接调用 void ReFreshBackground(){ WinExec...("D:\\documents\\Wallpaper\\ReFreshBackground.exe",0); } 当我们点击“打开”按钮,如果是第一次打开,需要新建窗体并设置为背景层窗体窗体,而之后就不用了...firstPlay){ ReFreshBackground(); } qApp->exit(0); } 退出也需要先判断是否打开了文件,如果没有打开,则不需要刷新壁纸

1.3K10

单件模式Singleton来控制窗体被重复或多次打开

Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对Java线程 内存等概念有相当了解。...问题描述:用了单件模式Singleton来控制窗体被重复或多次打开,最初是MDI子窗体写方法,后来看别人是属性,基本是一样,都可以,然后想是,项目中有诺多窗体,如果每个窗体都写一份,岂不太脑残...基类终于写好了,然后调试,发现确实可以控制窗体打开个数,即被多次打开,但是呢,当窗体操作完成并关闭后,,再次打开这个窗体就会出现(无法访问已释放对象)错误。...这里呢就有关系到C#垃圾回收问题。C#垃圾回收器管理所有的托管对象,所有需要托管数据.NET语言(包括 C#)都受运行库垃圾回收器制约。...首先,窗体重复或多次打开问题解决了;然后呢,每个窗体打开,只要一行代码就搞定了,不用每个窗体写一份属性,方法(其实质还是借鉴Singleton);最后呢,不会出现再次打开不能访问问题,即无法访问已释放对象问题

99620

WinForm事件与消息

消息概述以及C#封装 Windows下应用程序执行是通过消息驱动。...C#,消息被应用程序工作引擎通过轮询等方式遍历获取并按照消息类型逐个分发到对应组件(例如窗体、按钮等),最后调用对应组件所注册事件进行处理。...例如,调用Run以启动当前线程应用程序消息循环,并可以选择使其窗体可见;调用Exit或ExitThread来停止消息循环。...} 因为Application是线程运行,所以Application.Run开始后,Application本身不断轮询检查消息队列,然后根据消息类型进行数据分发。...窗体使用MouseClick事件函数指针调用已经添加响应函数。所以C#事件字段实质上是一个函数指针列表,用来维护一些消息到达响应函数地址。

26320

使用C#开发数据库应用程序

string boolean bool 注意:C#布尔类型关键字与java不同,使用bool,C#字符串数据类型是小写。...鼠标双击事件,当用户双击窗体发生 MouseMove 鼠标移动事件,当鼠标移过窗体发生 KeyDown 键盘按下事件,首次按下某个键发生 KeyUp 键盘释放事件,释放键发生 例如...)创建MDI【设置窗体:将窗体IsMDIContainer属性设为true。...设置子窗体调用打开窗体Show()方法前,代码中将子窗体MdiParent属性设为this】 例如: //用户单击菜单项,出现创建学员用户窗口 private void tsmiNewStudent_Click...=this; addStudentForm.Show();//显示创建学员用户窗体 } (2)为窗体添加子窗体列表【窗体添加一个菜单Name(tsmiWindows),添加一个"窗口"菜单项

5.8K30

Wallpaper原理和C#实现(含源文件)

窗体load事件里新建VideoForm。为了让VideoForm能够夹在图标层和背景层中间,需要将VideoForm窗体设置为背景窗体。...查找句柄 现在需要查找背景窗体句柄,使用窗口查看器发现背景窗体没有窗体名称,因此无法直接定位,但是我们知道它类名是WorkW,它窗体是Program Manager,所以我们可以遍历所有WorkW...窗体,如果其中一个窗体窗体是Program Manager,那么这个窗体就是背景窗体。...一旦返回空指针,会导致设置窗体失败,最后视频会在图标层上方播放,此时动态壁纸软件就彻底变成了一个全屏播放器。...这里利用了windows窗口一个特性:如果A窗体B窗体上面,那么A窗体也会在B窗体窗体上面。

1.9K10

再议Windows消息与WinForm事件

前言 2月份时候,我之前曾经写过一篇关于Windows消息与C# WinForm事件机制文章,名为《WinForm事件与消息》。在那篇文章,我简单探讨了一下事件和消息。...例如,调用Run以启动当前线程应用程序消息循环,并可以选择使其窗体可见;调用Exit或ExitThread来停止消息循环。...} 因为Application是线程运行,所以Application.Run开始后,Application本身不断轮询检查消息队列,然后根据消息类型进行数据分发。...实际上整个过程应该如下: 当我们按下鼠标左键后,消息形成并送往应用程序消息队列,然后被Application类从应用程序消息队列取出,然后分发到相应窗体。...窗体使用MouseClick事件函数指针调用已经添加响应函数。所以C#事件字段实质上是一个函数指针列表,用来维护一些消息到达响应函数地址。

19610

C# 窗体常用API函数 应用程序窗体查找

常用处理窗体API函数如下(注意:API函数必须放在窗体...): 使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名空间...(即EnumWindowslParam) 下面用一个例子对该方法说明 程序要实现一个功能:可以在当前打开窗体中找到目标窗体,并在需要将其激活,置为前台窗体 using System;using...根据窗口标题查找一般多用在多窗口应用程序,因为程序窗体标题固定,方便搜索。但要是对于系统一些窗体,例如记事本窗体,PPT等,窗体标题是不定,所以用窗口类搜索更方便。...如果用VC开发平台,可以使用其中Spy快速找到窗口类型,Spy++中有一个FindWindow工具,它允许你使用鼠标选择窗口,然后Spy++会显示这个窗口类。...,当在其他线程对当前线程窗体进行激活使用该方法是没有作用

3.9K70

c#实战教程_ps初学者入门视频

(17) 修改formAbout属性StartPosition=CenterParent,表示打开对话框,对话框在窗口中间。...两类对话框本质上都是窗体,是System.Windows.Forms.Form类派生类,只是打开使用方法不一样,打开模式对话框,使用方法ShowDialog(),而打开非模式对话框,使用方法Show...(21) 修改formFindReplace窗体属性StartPosition=CenterParent,表示打开对话框,对话框在窗口中间。...4.9.2 主窗口和子窗口菜单融合 许多多文档编辑器应用程序没有子窗体打开,菜单比较简单,而有子窗体打开后,菜单增多。...实现这种功能一般是窗体创建一个简单菜单,子窗体打开,只显示这个简单菜单。窗体也创建一个菜单,包含主窗体菜单没有的菜单项。

15.5K10

VB.NET窗体继承「建议收藏」

VB.NET和C#都是完全面向对象语言,而面向对象三大特性是封装、继承、多态,出了代码、功能上来体现,设计窗体是不是也可以用到呢?答案当然是YES!...如果一个程序中有多个界面相似,就可以考虑通过继承来实现,先建立一个窗体,然后让子窗体来继承它,相同代码就可以写在窗体,各自功能分别写在不同窗体,实现想要功能。...(建好后需要重新生成解决方案) 2.选择项目菜单下添加新项,弹出窗体做如下选择: 3.选择“添加”按钮,弹出窗体中选择要继承窗体,点确定即可。...4.继承来充值子窗体: 基本上已经完成了,但是会发现继承来窗体控件都是锁定,如果想要通过这些控件添加一些新功能,就需要将窗体控件Modifiers属性设置为Public,这样就可以了...当我们做了很多重复事情,就应该停下来思考一下,有没有更好方法。思想是行动先导,首先要思考,然后再行动。

77010

利用委托实现winform多个窗体传值

最近用C#做上位机程序开发,要实现这样一个功能: 窗体创建了两个子窗体——子窗体1和子窗体2,子窗体1产生数据要在子窗体2显示出来。...因为这两个子窗体本身之间并没有直接关联,他们都是由窗体new出来,所以就想着1数据先发给窗体窗体再发给2。这样结构上比较清晰,也符合松耦合模式。...子窗体1发送消息给窗体 窗体1定义一个委托 public delegate void SendMsg(string msg); 再定义一个事件 public event SendMsg send...,当我需要调用方法可以直接调用委托,而事件是绑定到委托上。...窗体转发消息给子窗体2 这回等于是窗体给子窗体发消息,所以我们窗体定义委托和事件,然后让子窗体2去订阅,代码如下,我们先去掉关于窗体1那部分以方便观察。

1.4K30

C#复习题 填空题

C#使用  const     关键字声明符号常量。 调用DataAdapter对象 Fill()   方法填充数据集。...C#,根据打开多个窗体之间是否存在相互制约关系,可将窗体显示模式分为_ _模态_窗体和_ 非模态 __窗体。...C#,根据打开多个窗体之间是否存在相互制约关系,可将窗体显示模式分为 ( 模态  窗体和  非模态   )窗体。...NET使用 System.Data.SqlClient   命名空间类访问SQL Server数据库数据。 窗体控件默认事件是 加载事件     。...为打开文件“C:\Winnt\Win.txt”进行读写操作,首先应该创建 File    类实例。 NET,用来与数据源建立连接对象是 Connection对象     。

3.9K10

创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

窗体线程一直是个难题,总是要出现奇奇怪怪错误。...今天开发alexSEO软件,出现了创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。...//BeginInvoke只能放置操作控件代码。BeginInvoke将子线程线程通过委托抛向UI主线程 。...,该窗体加载时候会读取设备数据,但会很耗时,为了防止窗体加载时候由于耗时代码,导致不能及时显示出来) frmGasBottlesInstall frmInstall = new frmGasBottlesInstall...当调试运行突然关闭软件,labb.Invoke(labchange);语句就出先了“创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”错误。

4.9K10

.NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体

但是企业级应用软件业务需求可能更加复杂,如JS调用C#方法之后,需要访问宿主窗体,设置窗体(WinForm、WPF、WinUI、Win32)控件等。...窗体 SetResultFromWeb() 方法 普通如访问一个窗体有两种方式 第一种是使用窗体类来实例化一个对象 Frm4JSCallWinForm form = new Frm4JSCallWinForm...(); 第二种方式直接使用窗体已经实例化之后对象。...步骤3 访问目标网页之前,通过webView2.CoreWebView2.AddHostObjectToScript()方法向网页中注入主机对象,其中第一个参数是自定义名称(随意命名),JS访问主机对象就需要与该参数名称一致...使用主机对象调用C#方法,由于调用过程是异步,所以需要使用 await,方法定义前需要加上 async。 以上四步完成后即实现了JS访问窗体方法。

2.3K40

WPF自学入门(八)WPF窗体之间交互

接下来我们一起来实现窗体之间传值,窗体上我们放两个控件,一个文本框TxtMessage,另一个是按钮BtnSend.子窗体上放一个文本框TxtInput。 窗体界面: ?...子窗体界面: ? 要实现传值,我们首先要在子窗体定义一个可读可写公用字符串:getMessage。然后窗体按下按钮时候,定义一个字符串Message,用来存放输入框文字。...当然我们写程序时,可能使用就不只是单纯传递一个值那么简单。因为本人还刚接触到一个WPF项目,没有想过场景。...这里我进行假设一个场景,依然还是有父子窗体,子窗体窗体中一个按钮属性设置器,窗体添上要设置属性值,然后按设置完成,子窗体关闭,窗体相应按钮属性也根据子窗体设置值而改变!...其实这里只是实现这个场景一种方法,也是比较简单方法,用到知识是C#委托。这里演示一个最简单例子: 下面看一下具体实现 在上一个例子窗体新增一个按钮返回BtnReturn。

2.2K10

C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用

博客《C#开发BIMFACE系列52 CS客户端集成BIMFACE应用技术方案》中介绍了多种集成BIMFACE到客户端程序方案。...允许开发者.NET应用程序嵌入Chromium。可以C#或VB或任何其他CLR语言中使用。CefSharp同时提供WPF和WinForms Web浏览器控件实现。...(2)WinForm 窗体输入 BIMFACE FileId,点击【加载模型/图纸】按钮,调用CefSahrp组件,加载步骤(1)网页。...定义一个单独类,用于CefSahrp组件加载网页之前,将其注入到网页 (4)WinForm窗体中点击【 C# 调用 JS 方法】按钮。...当控件Dock属性设置为 Fill,客户端电脑缩放与布局不是100%窗体呈现黑边(严重bug),并没有完全填充容器。 《BIMFace.SDK.CSharp》开源SDK。

2.4K40

FindWindowEx使用方法「建议收藏」

大家好,又见面了,我是你们朋友全栈君。 功能:这个函数获取窗口句柄。类名和窗体名称和给定字符串匹配形式。这个功能看起来子窗体,从一个给定窗体窗体回到下一个起始行。...LPCTSTR lpszClass,LPCTSTR lpszWindow); 參数: hwndParent:要查找子窗体窗体句柄。...函数仅查找全部消息窗体。 hwndChildAfter :子窗体句柄。查找从Z序下一个子窗体開始。 子窗体必须为hwndPareRt窗体直接子窗体而非后代窗体。...查找从hwndParent第一个子窗体開始。假设hwndParent 和 hwndChildAfter同一候为NULL。则函数查找全部顶层窗体及消息窗体。...C#使用该函数首先导入命名空间: using System.Runtime.InteropServices; 然后写API引用部分代码,放入 class 内部 [DllImport(“user32

1.1K20

C# SplitContainer 控件详细用法

使用 SplitContainer 控件,可以创建复合用户界面(通常,一个面板选择决定了另一个面板显示哪些对象)。这种排列对于显示和浏览信息非常有用。...在下面的代码示例,在窗体 Load 事件中将 SplitContainer 控件拆分器设置为拖动跳过 10 个像素。...C# this.Load += new System.EventHandler(this.Form1_Load); 3.如何:水平拆分窗口水平拆分窗口 程序,将 SplitContainer...,将创建一个类似于 Microsoft Outlook 中使用多窗格用户界面,该界面包含“文件夹列表”、“邮件”窗格和“预览”窗格。...这种排列主要是通过在窗体上停靠控件实现停靠控件,可以确定控件要紧靠容器哪个边缘。这样,如果将 Dock 属性设置为 Right,控件右边缘将停靠在它控件右边缘。

2.7K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券