创建窗体不抢夺焦点的方法

创建窗体,不抢夺焦点

http://www.cnblogs.com/cartler/

经过资料查找,发现可以设置WS_EX_NOACTIVATE

?

界面编程里面,经常碰到焦点问题,以下几点可注意:

1. Create时指定 WS_EX_NOACTIVATE属性,注意同时去掉WS_VISIBLE,这样创建窗口时不会抢焦点。

2.响应 WM_MOUSEACTIVATE 消息,返回 MA_NOACTIVATE,这样鼠标在其上操作时不会抢焦点,在popup窗口上做这条即可,对其子窗口一并有效。?

3.可以用 GetGUIThreadInfo() 取得当前焦点相应信息,用于查看焦点抢占情况。

经过这样设置的窗口,基本上解决不了我的问题。原因如下:

WINDOWS为每一个线程创建一个数据结构称为"线程本地输入状态",里面记录了该线程创建的窗口中哪个是活动窗口,哪个具有输入焦点,以及光标等信息(由操作系统维护)。
根据以上原理,如果是一个线程创建的两个窗口,用户是无法控制输入焦点的。因此要想在激活另一个窗口时,同时不能改变输入焦点,只能让这两个窗口分属于不同的线程(不必是不同的进程)。
看了你的问题后,我有个方案觉得很适合你的要求:
1)Frame1始终让edit控件具有输入焦点;
2)Frame2由另一个线程来创建;
3)使用WIN32?API的AttachThreadInput(Thread1ID,?Thread2ID,?TRUE)将Frame1和Frame2两个窗口的线程本地状态关联起来;

说得通俗点,Frame1和Frame2共享一个输入焦点,且两个窗口共享所有的鼠标,键盘操作。这或许是AttachThreadInput这个API的命名又来。具体使用情况楼主看下MSDN,自己码下代码!

也就是说同一个线程创建的窗口用WS_EX_NOACTIVATE样式是没有效果的。

问题还是需要解决,经过查证已找到正确方法:

?

  1. 创建窗口时去掉WS_VISIBLE属性,加上WS_DISABLED属性。
  2. 创建窗口,得到窗口句柄。
  3. ::ShowWindow(m_hWnd,SW_SHOWNOACTIVATE)显示窗口,则不会抢夺焦点。
  4. 更进一步,可以屏蔽鼠标点击时获得焦点的行为,响应WM_MOUSEACTIVATE,返回MA_NOACTIVATE。

完美收工!

时间: 2024-12-27 13:27:37

创建窗体不抢夺焦点的方法的相关文章

MFC使用Create创建创建窗体后释放内存的方法

当在一个窗口中生成另外一个窗口 时: CTestDlg *pTd ; 头文件定义 CRect rc; GetWindowRect(&rc); CRect rc1; pTd= new CTestDlg ; pTd->Create(IDD_123, this);//窗口的ID pTd->GetWindowRect(&rc1); pTd->MoveWindow(rc.left+190, rc.top+18, rc1.Width(), rc1.Height()); pTd->

C# 学习笔记(一) Winform利用Assembly反射动态创建窗体

1. 添加Reflection 1 //添加对Reflection程序集引用 2 using System.Reflection; 3 4 // 引用窗体创建方法CreateForm,传入参数 5 private void btnCreateForm_Click(object sender, EventArgs e) 6 { 7 CreateForm("testForms", "UseAssemblyToCreateForms"); 8 } 9 /// <su

Qt创建窗体的过程

版权声明 本文为原创作品,请尊重作者的劳动成果.转载必须保持文章完整性,并以超链接形式注明原始作者“ tingsking18”和 主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 QT源码解析(二)深入剖析QT元对象系统和信号槽机制 QT源码解析(三)深入剖析QT元对象系统和信号槽机制(续) QT源码解析(四)剖析Qt的事件机制原理 QT源码解析(五)QLibrary跨平台调用动态库的实现 QT源码解析(六)Qt信号槽机制与事件机制的联系

【Android进阶】关于ListView中item与控件抢夺焦点的那些事

在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者是CheckBox等控件以及其子类控件的时候,经常会碰到各种控件的点击事件冲突的情况,那么我们如何来处理Listview中这种控件之间焦点冲突的情况呢? 我们以item存在一个Button控件为例 首先,加入我们不设置任何关于焦点的属性,比如focus等,代码如下 @Override public

.net中创建xml文件的两种方法

方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建xml文档结构 1.创建实体类,保存窗体传递的值 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CreateXmlTest.Mod

C#窗体皮肤制作(二):创建窗体库项目以及最小化、最大化、关闭按钮的实现

很高兴有朋友关注这篇博客,同时也十分抱歉让关注的朋友久等了,隔上一篇博客也有3个月没有更新,主要是由于3月份辞职,4月份初离职到期离开了北京高德,来到了上海张江.目前新工作也处于熟悉当中,希望大家能体谅.刚好这周末有点时间,我就接着写写,这篇博客主要是针对初学者,希望给为他们能提供一种较易理解的窗体皮肤制作思路,记得自己当初学习C#编程的时候也是摸着石头过河. 闲话少说,我还是接着上篇博客继续写,上次说明了下如何收集图片资源,这次就以360安全卫士来做示例进行模仿,本来也想过模仿下qq,但是qq

C#中利用委托创建窗体单向通信

初学者在开始学习的时候,对于委托很难做到一下子理解,其中也包括我.委托好比一座大山,没爬上山顶就不能有"一览众山小"的感觉,只有你真正的爬到山顶的时候,才会发现大自然的是神奇. 委托我们可以把它认为是一个类,而不是一个方法.用委托我们可以调用方法,来简化程序,非常像C++中的指针. 使用委托的一般步骤为: (1)定义委托,delegate 返回值类型 委托类型名称(参数列表): (2)声明方法: (3)实例化委托,注意声明的类型要和方法中的类型一样. 下面给出例子,利用委托创建窗体单向

【Asp.net入门09】第一个Asp.net应用程序-创建窗体并设置其样式

本节内容: 添加一个aspx窗体并设计窗体内容 为aspx窗体添加样式 前面我们为PartyInvites应用程序项目添加了两个c#文件:GuestResponse.cs和ResponseRepository.cs文件.这两个文件里面的代码一个是用来描述数据的GuestResponse类,一个是用来进行数据读写的ResponseRepository类.这两个类都不是用户直接访问的页面.下面我们就要开始设计一个与用户交互的页面,也就是我们通常所理解的网页. 我们接下来的任务是创建创建一个包含晚会信

Delphi中主窗体的formshow事件在程序自动创建窗体对象前就调用的错误。

这个,实际我也不知道这个标题该怎么写.因为用一句话描述错误有点困难. 下面用代码来说明吧. 最近做了一个delphi的程序,按照我的习惯一般是先创建一个窗体作为主窗体,其他的窗体都在这个基础上显示.另外,由于使用了数据库,所以添加了一个TDataModule控件,便于一些不能防止控件的单元进行数据库操作.把其他所有的窗体都设置为非自动创建.然后通过application.createform方法进行动态创建和调用. 好了,问题出现了. 在工程文件中有如下代码: Application.Creat