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

系统学习Windows客户端开发

IP详解 卷1:协议 设计模式GoF版 编码规范 C++编码规范 C++语言 C++宏 C++11 用正则表达式查找提取替换字符串 如何保证static变量只初始化一次 STL容器区别与选择 无效迭代器问题进阶版...链接时无法解析符号checklist 界面开发 如何选择UI框架 syp++工具 窗口层级 PostMessage与SendMessage PostMessage严谨用法要这样做 屏幕坐标与客户坐标的区别...高DPI适配 拖动非标题栏移动窗口的坑 谁抢走窗口的焦点 界面显示乱码,怎么破? 工作线程调用ActiveX接口,有哪些坑?...不建议复用窗口管理对象 CreateWindow返回空句柄而GetLastError返回0咋回事 SetTimer得注意的两个坑 数据交换 详解JsonCpp库的使用 数据持久化 20分钟掌握sqlite...库的使用 动态库和静态库 动态库与静态库的区别 程序无法启动定位技巧 进程和线程 一个简单实用的线程基类 独立子线程设计 多线程下互斥访问共享资源 自动解锁与提前解锁 C++11 async那些奇怪的问题

3K30

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

action(); } } 使用 SetControlSafe(this.lbName, () => { this.lbName.Text = name; }); 方法二: 一般在多线程调用...,提示 “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke” ,并且如果没有捕获到,则可能导致程序崩溃,直接关闭。...百度之后,发现需要判断控件的IsHandleCreated和IsDisposed等属性,并且如果还有错误,可以再捕获InvalidOperationException异常,避免程序崩溃 但是在项目中有太多需要修改...} else { method(); } } } 代码中并没有专门捕获...InvalidOperationException,因为如代码中这样判断之后,不再会出现 窗口句柄未创建 的问题。

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

    windows消息机制详解

    一个线程可以对应多个窗口,但是在同一个程序里面多个窗口只能对应一个线程 总结 1、窗口是在0环创建的 2、窗口句柄是全局的 3、一个线程可以用多个窗口,但每个窗口只能属于一个线程 一个GUI线程只有一个消息队列...GetMessage( LPMSG lpMsg, //返回从队列中摘下来的消息 HWND hWnd, //过滤条件一:发个这个窗口的消息 UNIT wMsgFilterMin, //过滤条件...发送消息的程序是一直处于等待状态的,只有接收到返回的消息才会结束,这称为同步 如果利用PostMessage发送消息,处于第二个链表里面,GetMessage不会处理,而程序发完消息之后也会立即结束...NtUserDispatchMessage 根据窗口句柄找到窗口对象 根据窗口对象得到窗口过程函数,由0环发起调用 如果使用DispatchMessage分发消息,根据窗口句柄调用相关的窗口过程...所以调用窗口过程只能是以下三种情况 GetMessage()在处理SentMessagesListHead中消息时 DispatchMessage()在处理其他队列中的消息时 <

    62210

    getcomponent_getsocketopt

    第二个参数 输入参数,取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。...返回值 如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。...返回值 如果消息被转换(即,字符消息被送到线程的消息队列中),返回非零值。...而GetMessage则是一个具有线程同步行为的函数,如果消息队列中没有消息的话,函数就会一直等待,直到消息队列中至少有一条消息时才返回。...如果消息队列中没有消息,PeekMessage总是能返回,这就相当于在执行一个循环,如果消息队列一直为空, 它就进入了一个死循环。GetMessage则不可能因为消息队列为空而进入死循环。

    41710

    C# 进程间通讯

    msg,IntPtr wP,IntPtr lP); 要有此函数,需要添加using System.Runtime.InteropServices;命名空间 此方法各个参数表示的意义 wnd:接收消息的窗口的句柄...如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。 msg:指定被发送的消息类型。...用api参考手册查看SendMessage用法时,参考手册则提示 SendMessage与PostMessage之间的区别:SendMessage和PostMessage,这两个函数虽然功能非常相似,都是负责向指定的窗口发送消息...而PostMessage() 函数在发出消息后马上返回,其后语句能够被立即执行,但是无法获取接收方的消息处理返回值,即是说此方法是异步的。...启动ProcessCommunication1.exe可执行文件,在弹出的窗体中的文本框中输入任意数字,点击button1按钮,接受消息窗体textBox1即显示该数字。 到此结束。 ?

    1.5K20

    Invoke 和 BeginInvoke 的区别

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate 一、为什么Control类提供了Invoke和BeginInvoke机制?...有些api发送消息需要一个窗口句柄,这种函数可以把消息发送到指定窗口的主线程消息队列;而有些则可以直接通过线程句柄,把消息发送到该线程消息队列中。 ?...PostMessage也是一个用来发送消息到窗口消息队列的api函数,但这个方法是非阻塞的。也就是它会马上返回,而不管消息是否真的发送到目的地,也就是调用者不会被阻塞。...也就是说在Invoke封送的方法被执行完毕前,Invoke方法不会返回,从而调用者线程将被阻塞。...在调用者对象和UI对象同属一个线程的时候这个属性返回false。在后面的代码分析中我们可以看到,Control类对这一属性的实现就是在判断调用者和控件是否属于同一个线程的。

    84420

    CC++ 实现模拟键盘鼠标

    今天写了点代码,功能是筛选桌面中符合某些条件的窗口,模拟鼠标键盘实现全选 → 复制 → 检测剪切板 → 判断是否存在某些敏感字符串。 大致功能是这样。...在本代码中的详解 首先就是,为什么用 PostMessage 而不用 SendMessage ?...因为 SendMessage 会等待目标返回的结果,如果你发送消息的窗口一直不返回结果,它就会一直等待下去,导致程序卡死在这里,而 PostMessage 不会去关心这些问题。...这是上面代码中的一部分: // 模拟鼠标 PostMessage( hwnd, // 目标窗口句柄 WM_RBUTTONDOWN, // 更多鼠标事件宏定义类型参考 : https:/...,而不是屏幕的坐标) ); // 模拟键盘 PostMessage( hwnd, // 目标窗口句柄 WM_KEYDOWN, // 更多键盘事件共定义参考 : https://docs.microsoft.com

    1.6K11

    FindWindowEX应用实例二则

    函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。...查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。...lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。...>0 then PostMessage(cHwnd,WM_KEYDOWN,VK_RETURN ,0) ; //按回车键 end; end.... (4)根据窗口句柄,调用ShowWindow函数控制任务栏各区域显示或隐藏(Show/Hide);调用EnableWindow函数控制任务栏各区域有效或无效(Enabled/Disabled)。

    55020

    invoke和begininvoke 区别——c#

    下面我们在来说下.NET中对invoke和begininvoke的官方定义。 control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。...control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。...有些api发送消息需要一个窗口句柄,这种函数可以把消息发送到指定窗口的主线程消息队列;而有些则可以直接通过线程句柄,把消息发送到该线程消息队列中。 ?...PostMessage也是一个用来发送消息到窗口消息队列的api函数,但这个方法是非阻塞的。也就是它会马上返回,而不管消息是否真的发送到目的地,也就是调用者不会被阻塞。...在调用者对象和UI对象同属一个线程的时候这个属性返回false。在后面的代码分析中我们可以看到,Control类对这一属性的实现就是在判断调用者和控件是否属于同一个线程的。

    2.7K41

    windows 常用thread方法

    在Windows 98中忽略该参数。...在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE dwStackSize,设置初始栈的大小,以字节为单位...hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。...返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。...12.HANDLE GetCurrentThread() 得到当前的线程的伪句柄,表示只在调用的线程中使用有效。

    1.2K30

    【C#】给无窗口的进程发送消息

    ,准确说是要有有效的主窗口句柄,表现在访问Process.MainWindowHandle能得到一个非IntPtr.Zero的值,即有效的句柄;或者用spy类工具能看到该进程下有至少一个窗口;或者按alt...该API是向指定线程发送消息(MSDN文档在此),这也说明在原理上,消息并非只可以发给窗口,还可以发给线程,至于还能不能发给别的什么东西就不知道了。...另外,目标进程也许有多个线程,其中哪个才是能收消息的主线程我没有科学的判断方法,大胆臆测就是Process.Threads集合中的第1项,这个猜测至今工作良好,不管它。...怎么收 由于消息是走线程过来的,所以别想着在主窗口的WndProc中去收,再说消息过来的时候,主窗口存不存在都是个问题。...,在事件处理方法中再写显示窗口相关的代码。

    1.9K30

    web messaging与Woker分类:漫谈postMessage跨线程跨页面通信

    否则,您信任只发送受信任邮件的网站中的安全漏洞可能会在您的网站中打开跨网站脚本漏洞。 使用postMessage将数据发送到其他窗口时,始终指定精确的目标origin,而不是*。...worker.postMessage Worker 接口是Web Workers API 的一部分,代表一个后台任务,创建一个专用Web worker,它只执行URL指定的脚本,并且在工作线程中执行。...不同于普通Worker,Service Worker 是一个浏览器中的进程而不是浏览器内核下的线程(Service Worker是走的另外的线程,可以理解为在浏览器背后默默运行的一个线程,或者说是独立于当前页面的一段运行在浏览器后台进程里的脚本...如果一个对象的所有权被转移,在发送它的上下文中将变为不可用(中止),并且只有在它被发送到的worker中可用。...()  onmessageerror  onerror特性是一个事件句柄,在 Worker的error事件触发并冒泡时 onmessageerror 事件处理器接口是一个EventListener, 在

    2.2K30

    【CC++】回调函数详解&注册窗口类&LRESULT & CALLBACK详解以及游戏中的应用

    ,如果成功会返回一个窗口类的句柄,如果失败则会返回0。...LRESULT & CALLBACK详解 LRESULT 是一个整形变量,应用程序在执行完窗口过程函数后通过该值将结果返回给 Windows。...发送一消息的含义是跳过消息队列,操作系统直接将其传递到窗口过程函数。 前者对应 API 中的 PostMessage 函数,该函数调用后会立即返回。...一般在使用中 SendMessage 会导致线程堵塞,所以在处理耗时的任务时不推荐使用,会导致界面假死,常用的场景是一些同步通知且处理迅速的场景。...WM_NCCREATE 和 WM_CREATE 消息会在窗口显示之前发送,初始化 UI 的逻辑可以放到二者的消息处理函数中。例如,可以在处理函数中处理窗口布局初始化的代码。

    1.7K21

    Windows窗口消息和消息队列

    线程的活动窗口句柄 线程的焦点窗口句柄 线程鼠标捕获窗口句柄 线程的拥有提示符的窗口句柄 其他线程的状态变量 }; 从上面看出每个线程有四个队列:一个登记消息队列...对于发送给本线程的消息(hWnd是本线程的窗口句柄),则SendMessage函数直接调用相应的窗口的回调函数,让后将回调函数的返回作为SendMessage函数的返回;而对于将消息发送给别的线程的窗口...在发送线程等待结果前进入阻塞的这段时间里,若发现本线程的发送消息对列中有消息时,也会去处理本线程的所有发送消息队列中的消息,也就是说,在SendMessage函数返回前,可以确保本线程的发送消息队列中没有任何消息...在调用ReplyMessage之后,发送消息的线程恢复执行,而处理消息的线程继续处理消息。两个线程都不会被挂起,都可以正常执行。当处理消息的线程从它的窗口过程返回时,它返回的任何值都被忽略。...如果你在处理线程间的消息发送时调用了ReplyMessage,则它返回TRUE ,如果你在处理线程内的消息发送时调用ReplyMessage,它返回FALSE 6.在处理一个消息时,确认此消息时由本线程发送的还是由其他线程发送而来的

    2.6K50
    领券