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

WinForm多线程修改控件时,提示创建窗口句柄之前,不能在控件调用 Invoke 或 BeginInvoke

btnRefresh.Enabled = true; }); 但是假如在多线程操作还没完成的时候,我就提前关闭窗体,则会引发InvalidOperationException,提示 “创建窗口句柄之前...,不能在控件调用 Invoke 或 BeginInvoke” ,并且如果没有捕获到,则可能导致程序崩溃,直接关闭。...百度之后,发现需要判断控件的IsHandleCreated和IsDisposed等属性,并且如果还有错误,可以再捕获InvalidOperationException异常,避免程序崩溃 但是项目中有太多需要修改...method(); } } } 代码中并没有专门捕获InvalidOperationException,因为如代码中这样判断之后,不再会出现 窗口句柄创建...= true; }); 跟之前的代码差别不大,可直接替换所有跨线程调用UI的代码。

2.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    invoke和begininvoke 区别——c#

    下面我们来说下.NET中对invoke和begininvoke的官方定义。 control.invoke(参数delegate)方法:拥有此控件的基础窗口句柄的线程执行指定的委托。...control.begininvoke(参数delegate)方法:创建控件的基础句柄所在线程异步执行指定委托。...解决从不是创建控件的线程访问它 多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的...这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会调用DispatchMessage方法派遣消息,这会引起对窗体窗口过程的调用。...返回之前调用者将会被暂时阻塞。 PostMessage也是一个用来发送消息到窗口消息队列的api函数,但这个方法是非阻塞的。

    2.6K41

    Invoke 和 BeginInvoke 的区别

    这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会调用DispatchMessage方法派遣消息,这会引起对窗体窗口过程的调用。...Invoke或者BeginInvoke方法,通过一个委托把调用封送到控件所属的线程执行。...有些api发送消息需要一个窗口句柄,这种函数可以把消息发送到指定窗口的主线程消息队列;而有些则可以直接通过线程句柄,把消息发送到该线程消息队列中。 ?...返回之前调用者将会被暂时阻塞。 PostMessage也是一个用来发送消息到窗口消息队列的api函数,但这个方法是非阻塞的。...也就是说Invoke封送的方法被执行完毕前,Invoke方法不会返回,从而调用者线程将被阻塞。

    81720

    手把手教使用c#开发一个windows动态桌面程序使用视频作为桌面

    接下来我们使用vs创建一个windfrom窗体应用程序。 先了解一下基础知识,C#中,我们不能直接获取窗口控件句柄,因为C#是托管语言,直接支持低级别的Windows API函数。...但是,我们可以使用一种叫做P/Invoke(Platform Invocation Service)的技术,通过它我们可以调用Windows API函数。...如果你想要获取窗口句柄,可以使用 FindWindow 或者 FindWindowEx 函数,这些函数都在 user32.dll 中。...下面是一个简单的例子: 我们创建一个Utils的类,实现查找窗口句柄需要需要的方法如下: 我们创建的窗体Load方法中就可以直接调用:Utils.GetWorkerW()和Utils.SetWinParent...nuget中搜索Microsoft.Web.WebView2安装到项目中,Microsoft.Web.WebView2是一个允许你将Web技术(HTML、CSS和JavaScript)嵌入到本机应用中的控件

    77010

    windows GUI自动化怎么做

    先用tracker来录制,创建业务流程还好,但是一旦要处理弹框,上传附件,就有点吃力了。 然后用了python的一些库来对付。...缺点是要层层遍历,性能变低,还需要开一个窗口,有时候窗口不是很稳定。基本上元素都會解析出來,穩定是因爲有太多類似的。...这个模块之前讲过,就不在这里重复了。...Adobe Acrobat的句柄通过父窗口句柄获取子句柄#parent为父窗口句柄iddef get_child_windows(parent): 下面重点讲这个库 pywinauto pywinauto...例如:点击“帮助->关于记事本”操作; app.Notepad.MenuSelect('帮助->关于记事本') 项目企业微信PC版样式有点兼容问题,如果不能在企业微信直接调试,那效率非常低,问题又不容易定位到

    2.2K40

    emWin学习

    桌面窗口窗口管理器自动创建,并始终覆盖整个显示区域。桌面窗口始终是对底层的窗口没有定义其他窗口时,桌面窗口就是默认窗口,其他窗口都是其后代。句柄是WM_HBKWIN....句柄创建窗口后,Wm会分分配一个唯一标识符称为句柄句柄用于该特定窗口中执行其他任何操作。...GUI_Delay() GUI_Exec(); 函数对无效窗口进行重绘。 窗口控件通过其创建函数返回的句柄进行引用。...(也就是窗口设置创建标记必须在初始化之前)。 需要定时的调用函数GUI_Exec() 来执行GUI界面的重绘。...2.3 按钮控件 控件也是一个窗口,可以创建在其他窗口中或者直接在桌面上创建。按键也可以调用BUTTON_SetBitmapEx();函数在按钮显示一个位图。

    1.9K10

    winform开发 总结1>winform程序使用线程的必要性,以及正确的使用方式

    那么在编写程序之前必须要明白的一个点就是窗体的UI的操作只能通过UI线程来执行,其他线程如果要去执行窗体中的控件值修改或者其它【任何和窗体线程相关的操作】,就会报异常,所有人都知道的。...InitializeComponent(); CheckForIllegalCrossThreadCalls = false;//时候捕获对错误线程的调用...然后再看看Invoke,BeginInvoke到底是什么东西: 直接F12找到签名对应的解释 // // 摘要: // 创建控件的基础句柄所在线程异步执行指定委托。...// // 异常: // System.InvalidOperationException: // 找不到适当的窗口句柄。...EditorBrowsable(EditorBrowsableState.Advanced)] public IAsyncResult BeginInvoke(Delegate method); 关键字: 拥有此控件的基础窗口句柄的线程执行执行的委托

    74210

    C#中Invoke的用法()

    下面我们来说下.NET中对invoke和begininvoke的官方定义。 control.invoke(参数delegate)方法:拥有此控件的基础窗口句柄的线程执行指定的委托。...control.begininvoke(参数delegate)方法:创建控件的基础句柄所在线程异步执行指定委托。...那么现在我们回想下invoke(同步)和begininvoke(异步)的概念,其实它们所说的意思是相对于子线程而言的,其实对于控件调用总是由 主线程来执行的。...解决从不是创建控件的线程访问它 多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的...如果直接设置程序必 定会报出:从不是创建控件的线程访问它,这个异常。通常我们可以采用两种方法来解决。一是通过设置control的属性。

    2.2K41

    MATLAB GUI编程总结

    (窗口),可以窗口中添加如下控件 1.静态文本(Static Text) 2.编辑框(Edit Text)控件 3.列表框(Listbox...(2)CData:控件显示的真彩色图像,使用矩阵表示。 (3)ForegroundColor:文本颜色。 (4)String属性:控件的文本,以及列表框和弹出菜单的选项。...四:句柄图形之间的层次关系 可以创建 图形句柄的常见函数 1.figure函数:创建一个新的图形对象。 2.newplot函数:做好开始画新图形对象的准备。...但是,控件的CreateFcn函数中如果想访问控件,必须用hObject,而不能用handles.edit,因为这时控件还没被创建,其句柄还没有加入到handles结构中。...其调用格式列举如下: close:关闭当前窗口,等价于close(gcf) close(h):关闭对象h的窗口 close name:关闭名为h的窗口 close all:关闭所有句柄可见的窗口

    2.1K10

    达观金克:RPA界面元素智能自适应定位与操控技术

    Win32自动化技术基于HWND(窗口句柄),一般需要通过 FindWindow、 EnumWindows 来查找目标窗口句柄,然后再调用其它 API,例如 GetWindowText、GetWindowRect...例如使用SetWindowText来设置显示的文字,使用SetActiveWindow来激活窗口等。优点:对标准Windows控件支持良好缺点:过于底层,调用复杂。...例如:Win32 API查询窗体需要逐层获取窗体句柄进行遍历查找技术落后,用途广。例如:Win32 API对新UI框架以及自定义控件的支持很差。...例如执行点击按钮操作, UIA 统一归类于Invoke, 无论是Win32、 WPF还是Silverlight按钮,都可以通过Invoke实现点击,不用关心具体实现方式是模拟键鼠还是调用Windows...拿到窗口后,可以根据窗口句柄获取虚拟机编号vmID 和根节点ac。

    1.3K10

    aardio中的多线程

    这些对象传入另一个线程时通常会复制值 - 也就是传值而非传址(传引用)。 类不可以从一个线程传入另一个线程使用。 类创建的实例对象,除非文档有特别说明一般不可以传入另一个线程使用。...win.form 创建的窗体对象以及该窗体创建控件对象都可以作为参数传入其他线程。 在其他线程调用窗体与控件对象的成员函数时 —— 都会回发到创建窗体的界面线程执行。...利用这种奇妙的特性 —— 实际可以工作线程调用界面线程的任意代码。 COM 对象不可以从一个线程传递到另一个线程。...invokeAndWait 我们有时候界面中创建一个线程,仅仅是为了让界面卡顿,我们希望用 thead.waitOne() 阻塞等待线程执行完闭(界面线程同时可以响应消息),然后我们又希望在后面关闭线程句柄...会阻塞并等待线程执行完毕,并关闭线程句柄,同时获取到线程函数的返回值。

    1.4K51

    Matlab系列之GUI设计基础

    菜单编辑器中还有个上下文菜单,这个是相当于给组件添加右键菜单的,先在编辑器中创建好菜单 ? 然后回到GUI窗口,拖个按钮控件到工作区举例 ?...控件属性 了解了这些控件后,就需要再了解下控件的属性,才能在设计的时候用的很顺手,接下来再介绍下常规的属性,若有特殊的属性未进行介绍,就需要自行获取,在窗口输入下方的命令,打开控件文档: %本人使用了R2016A...MATLAB 执行 CreateFcn 回调之前初始化所有的控件属性值。如果指定 CreateFcn 属性,则 MATLAB 执行默认的创建函数。...CreateFcn 代码中使用 [gcbo] 函数可以获得创建控件句柄。 对现有控件设置 CreateFcn 属性没有任何作用。...MATLAB 销毁控件的属性之前执行 DeleteFcn 回调。如果指定 DeleteFcn 属性,则 MATLAB 执行默认的删除函数。

    5.9K10

    duilib创建自定义控件

    自己的程序中如果用到相关的,最好也用宏,这样一般需要修改某个宏对应的字符串,仅改声明就行了。       理论,完成这两个接口就创建好最基本的自定义控件了。...,有些UI拥有窗口句柄,需要重写 以上列出的函数,是最常被重写的。...DoInit函数里,调用CreateWindowEx函数,创建一个win32子窗体,并且用m_hWnd保存句柄。...然后我们的自定义控件内,不再声明HWND类型m_hWnd变量了,而是自定刚才的窗体类的对象。然后DoInit函数内调用这个对应的Create函数函数来创建窗体类。...2.使用WS_POPUP弹出式真子窗口。3.浏览器组件使用OSR等方式,自己绘制到窗口dc,这是无窗口控件。具体的使用哪一种自己根据需求。

    3K50

    深入了解 WPF Dispatcher 的工作原理(InvokeInvokeAsync 部分)

    为什么凭空出现了一个可以用来发送消息的窗口?于是, Dispatcher 构造函数中发现了这个窗口。...请进入 MessageOnlyHwndWrapper 类看,它的基类 HwndWrapper 中直接使用了方法 UnsafeNativeMethods.CreateWindowEx 创建了这个窗口,然后拿到了它的句柄...所以严格意义只分了两种——前台优先级和非前台优先级。而区分他们的一个分界点就是——用户的输入。 如果有用户的输入发生,那么会开启一个定时器,定时器时间到达之前,所有的后台优先级任务都不会去执行。...这样保证了阻塞线程的情况下进行“等待”。至于如何做到“阻塞地等待”,请参阅本系列的第二篇文章 深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)。...总结 进入了 .NET Framework 4.5 及以上的开发者们,建议使用 InvokeAsync 代替 BeginInvoke; Dispatcher 通过创建一个隐藏的消息窗口来让一个个 Invoke

    3.7K21

    实际运行之前,Java 虚拟机将根据这个符号引用链接到具体的目标方法。 可以看到,在这四种调用指令中,Java 虚拟机明确要求方法调用需要提供目标方法的类名。在这种体系下,我们有两个解决方案。...但它与反射 API 不同,其权限检查是句柄创建阶段完成的。实际调用过程中,Java 虚拟机并不会检查方法句柄的权限。如果该句柄被多次调用的话,那么与反射调用相比,它将省下重复权限检查的开销。...需要注意的是,方法句柄的访问权限取决于方法句柄创建位置,而是取决于 Lookup 对象的创建位置。...匹配的情况下,便会在运行时抛出异常。 如果你需要自动适配参数类型,那么你可以选取方法句柄的第二种调用方式 invoke。它同样是一个签名多态性的方法。...方法句柄的权限检查发生在创建过程中,相较于反射调用节省了调用时反复权限检查的开销。 方法句柄可以通过 invokeExact 以及 invoke调用

    1K30

    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

    ;思路,第一步,取得窗口的实例句柄,给hInstance invoke GetModuleHandle,NULL         ;调用API即可获取,返回值默认放在Eax当中 mov @hInstance...,所以上传到课堂资料中了 ;注册窗口invoke RegisterClass,addr @wc ;在这里我们使用伪指令addr,他的作用是自动帮我们计算局部变量所在的内存地址, 如果对指令不挑明白...,可以打开OD找到这个地方看下指令是怎么写的 ;创建窗口 invoke CreateWindowEx, ;这里注意一下只能使用CreateWindowEx,因为.inc文件中没有CreateWindows...NULL,              ;窗口的菜单 @hInstance,          ;程序的实例句柄 NULL              ;创建窗口的额外参数 mov...@hWnd,eax           ;创建窗口后返回一个窗口句柄,返回值地方eax中,这个上面定义了 ;显示窗口 invoke ShowWindow,@hWnd,SW_SHOW

    1.4K80

    使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流

    用于前台播放,因为它创建device时并未指定窗口和其他相关参数,大家可以参考我代码实现,我将窗口句柄传入后创建过程完全改变(其他人如果使用我们编译的代码,他没有传入窗口句柄,就执行原来的创建,因此百分百兼容...编译产出   C#中使用我们产出的方式需要使用p/invoke和unsafe代码。...这里给大家解释一下原因: 这个get_format的作用是ffmpeg给你提供了多个解码器让你来选一个,而且它内部有一个机制,如果你第一次选的解码器生效(初始化错误等),它会调用get_format第二次...baseline的判定必须解出sps/pps才能知道,因此这个错误可能会延迟爆出(不过不用担心,如果此时报错,ffmpeg会自动降级为软解) 窗体大小改变 基于DirectX中设备后台缓冲的宽高无法动态重设,我们只能在控件大小改变时推倒重来...进行可能的异常处理(实际还是推倒重来)   番外篇:C#对DiretX调用的封装 上文中我们使用DirectX的方式看起来即非COM组件,又非C-DLL的P/Invoke,难道DirectX真有托管代码

    3.3K11
    领券