如何检测窗口当前正在运行模式对话框?

时间:2018-09-20 18:02:48

标签: c++ winapi mfc modal-dialog

我有一个向导界面(因此带有属性页的属性表)。

在其中一个页面上,我正在运行一个后台计时器,以不断检测给定的外部事物是否正确(好吧,我编制了一个已连接的可见USB安全加密狗的列表)。

但是当此页面显示模式对话框时-例如一个MessageBox,我想暂停/忽略计时器通知。

我可以通过简单地终止计时器-运行消息框-然后重新启动计时器来做到这一点。这可以完美地工作,但是要求所有对MessageBox的调用都必须记住要这样做。没什么大不了的,但是很优雅。

现在,我还可以包装MessageBox,以便使用帮助程序包装器功能为调用者执行暂停/恢复计时器。这是一个正确的想法-但仍然需要维护编码人员始终记住调用我的包装器函数,这对于可能需要运行的其他模式对话框(以及还需要使暂停/恢复计时器跳动)的效果不佳执行。

我认为理想的是让计时器保持运行状态,但是让计时器处理程序本身检查我们当前是否正在运行模式对话框,如果是这样,则只需忽略计时器通知(计时器将继续在其中弹出通知)片刻-最终我们将使用模式对话框[消息框]完成,然后我们可以继续处理计时器通知。)

但是我看不到的是一种询问“我现在正在运行模式对话框吗?”的机制。

从页面计时器处理程序的POV中-它不知道模式对话框是否在进行中。 IsWindowEnabled()返回true-因此至少标准窗口MessageBox()不会禁用父窗口...这使我对它如何锁定其父窗口上的按钮单击感到困惑(我的想法是这几天过筛-也许答案很明显,我才刚老;))

无论如何-我想念什么? “是否正在该线程中运行模式对话框/作为该窗口的子代?”的简单测试是什么?

感谢您可能需要提供的任何温柔线索

1 个答案:

答案 0 :(得分:0)

因此,我是从属性页的上下文询问describe('MyComponent', () => { let component: MyComponent; let fixture: ComponentFixture<MyComponent>; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [MyComponent], providers: [ { provide: LOCATION_TOKEN, useValue: window.history } ] }) .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(MyComponent); component = fixture.componentInstance; fixture.detectChanges(); }); describe(('goBack()'), () => { it('should be clicked', inject([LOCATION_TOKEN], (_loc: Location) => { spyOn(_loc, 'back'); component.goBack(); expect(_loc.back).toHaveBeenCalledTimes(1); })); }); }); 的,该属性页是向导对话框中的子窗口。

在运行模式对话框时,将其更改为IsWindowEnabled()会返回GetParent()->IsWindowEnabled()