研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息

为了与Win32 GUI的函数功能兼容,得先知道Windows是怎么处理这些信息的,才能模仿。

这次研究对象是SetActiveWindow与SetFocus和窗口消息WM_SETFOCUS,WM_ACTIVATE之间的关系

------------------------------------

SetFocus

功能:设置新的焦点窗口,只有焦点窗口才能获取键盘输入消息

1.这个函数会检查输入的窗口,如果是最小化的窗口,或者禁用的窗口,则不会改变焦点.

2.如果要设置的焦点窗口是子窗口,且其父窗口不是激活状态,还会调用SetActiveWindow将其父窗口激活.

3.检查激活窗口是否成功,如果没有成功,则取消设置新焦点.

4.向窗口发送WM_SETFOCUS消息,向前一个焦点窗口发送WM_KILLFOCUS消息

-----------------------------------

SetActiveWindow

功能:设置激活窗口,只有激活窗口,才能拥有焦点窗口

1.检查传入的窗口,如果是子窗口,则取消操作

2.向当前激活窗口发送WM_NCACTIVE消息,如果当前激活窗口返回FALSE,则表示它不同意其它窗口被激活,所以取消操作.

3.如果第2步没有问题,则向当前激活窗口发送WM_ACTIVE消息,告之被取消激活.

4.将传入的窗口标记为激活窗口,并将窗口的Z序置顶,

5.向新激活窗口发送WM_NCACTIVE和WM_ACTIVE消息,告之被成功激活.


---------------------------------

WM_NCACTIVE

这个消息通知窗口,非客户区被激活或取消激活.

当WPARAM参数为FALSE时,表示窗口要被取消激活,此时如果返回FALSE,则会阻止被取消激活,返回TRUE则表示允许被激活。

DefWindowProc 处理方式:做一些内部标记,如果lParam为-1的话,还要重绘标题栏和菜单栏!


WM_SETFOCUS 

这个消息是通知窗口,即将获得或失去焦点;

DefWindowProc好像并没有处理这个消息。


WM_ACTIVATE 

 这个消息是通知窗口,即将被激活或取消激活;

DefWindowProc 处理方式是:如果这个窗口马上要被激活了,则将这个窗口设置为焦点窗口


---------------------------------

这里很诡异的是,如果对一个未激活的主窗口调用SetFocus,它会激活这个窗口,

而激活这个窗口会发送WM_ACTIVE消息,而默认处理WM_ACTIVE消息的方式又是对这个窗口调用SetFocus...


你好,关于你的问题,我可以提供如下的解答,希望能够帮到你。 首先,使用win32com库处理windows弹出文本框需要安装pywin32模块,可以通过以下命令进行安装: ```python pip install pywin32 ``` 接下来,可以使用win32com模块的FileDialog方法来实现打开文件对话框,并选择需要打开的文件。具体操作步骤如下: 1. 导入win32com模块和win32com.client模块: ```python import win32com import win32com.client ``` 2. 创建COM对象: ```python shell = win32com.client.Dispatch("WScript.Shell") ``` 3. 调用FileDialog方法打开文件对话框: ```python file = shell.FileDialog(0) ``` 其,参数0是表示选择的是单个文件,参数1表示选择的是多个文件,参数2表示选择的是文件夹。 4. 调用Show方法显示文件对话框: ```python file.Show() ``` 5. 获取选择的文件路径: ```python file_path = file.SelectedItems()[0] ``` 完整代码如下: ```python import win32com import win32com.client # 创建COM对象 shell = win32com.client.Dispatch("WScript.Shell") # 打开文件对话框 file = shell.FileDialog(0) # 显示文件对话框 file.Show() # 获取选的文件路径 file_path = file.SelectedItems()[0] # 打开文件 doc = win32com.client.Dispatch("Word.Application") doc.SetActiveWindow() doc.Documents.Open(file_path) doc.Visible = True ``` 以上就是使用win32com库处理windows弹出文本框,并打开选择的文件的详细教程。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值