如何禁用VFP9开发的Win10应用upt.ocx忙时弹出的应用忙提示
Visual FoxPro 9 场景下upt.ocx支付忙弹窗禁用方案
这个弹窗是Windows系统默认的「应用程序忙」提示,触发原因是VFP单线程运行模型下,处于忙碌状态的upt.ocx阻塞了主线程消息循环,系统检测到窗口消息无响应就会自动弹出该提示。以下是可落地的解决方案,按改动成本从低到高排序:
方案1:修改VFP ActiveX相关配置,直接屏蔽弹窗
VFP提供了原生的配置参数专门解决这类ActiveX控件阻塞导致的系统提示,对现有代码改动最小:- 在调用upt.ocx支付相关方法前,执行配置代码:
* 开启ActiveX忙状态下的系统弹窗屏蔽 SYS(2333, 1) * 关闭VFP自动让出CPU的逻辑,避免消息循环被抢占 _VFP.AutoYield = .F.- 支付流程完全结束(无论成功/失败)后,恢复默认配置避免影响其他功能:
_VFP.AutoYield = .T. SYS(2333, 0)该方案生效后,ocx忙碌时应用会暂时无响应,符合可接受的预期,不会再弹出系统提示,也不会出现用户误点重试导致的交易状态不一致问题
方案2:支付过程中锁定用户操作,从根源避免触发条件
如果不希望应用出现无响应状态,可以在触发支付流程前,暂时限制用户切换操作:- 将应用窗口强制置顶,同时屏蔽Alt+Tab、Win键等系统切换快捷键,禁用任务栏点击
- 对应实现的参考代码:
* 窗口置顶声明 DECLARE INTEGER SetWindowPos IN user32; INTEGER hWnd, INTEGER hWndInsertAfter, INTEGER X, INTEGER Y, INTEGER cx, INTEGER cy, INTEGER wFlags * 置顶窗口 SetWindowPos(_SCREEN.HWnd, -1, 0, 0, 0, 0, 0x0001 OR 0x0002) * 支付结束后取消置顶 * SetWindowPos(_SCREEN.HWnd, -2, 0, 0, 0, 0, 0x0001 OR 0x0002)该方案可以避免用户在支付关键阶段切换应用,也就不会触发系统忙弹窗,对普通用户的操作体验影响更小
方案3:弹窗自动拦截处理
如果前两个方案受业务限制无法落地,可以用Windows API钩子监听系统弹窗:
支付过程中启动低优先级定时器,每隔500ms检测类名为#32770的系统标准对话框,如果匹配提示文本则自动发送「切换到」命令,避免用户误点重试按钮,不会触发ocx返回交易失败的问题。
优先推荐使用方案1,是VFP开发场景下处理ActiveX控件忙弹窗的标准解法,经过大量项目验证稳定有效。
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

