如何检测SetForegroundWindow是否更改屏幕分辨率?

时间:2017-08-18 14:09:23

标签: c# winapi resolution alt-tab setforegroundwindow

我正在C#中编写 Alt + Tab 替换,并且在全屏应用程序中遇到问题。

有没有办法检测 import sqlite3 conn = sqlite3.connect('emaildb2.sqlite') cur = conn.cursor() cur.execute(''' DROP TABLE IF EXISTS Counts''') cur.execute(''' CREATE TABLE Counts (org TEXT, count INTEGER)''') fname = input('Enter file name: ') if (len(fname) < 1): fname = 'mbox.txt' fh = open(fname) list_1 =[] for line in fh: if not line.startswith('From: '): continue pieces = line.split() email = pieces[1] dom = email.find('@') org = email[dom+1:len(email)] cur.execute('SELECT count FROM Counts WHERE org = ? ', (org,)) row = cur.fetchone() if row is None: cur.execute('''INSERT INTO Counts (org, count) VALUES (?, 1)''', (org,)) else: cur.execute('UPDATE Counts SET count = count + 1 WHERE org = ?', (org,)) conn.commit() # https://www.sqlite.org/lang_select.html sqlstr = 'SELECT org, count FROM Counts ORDER BY count DESC LIMIT 10' for row in cur.execute(sqlstr): print(str(row[0]), row[1]) cur.close() 来电是否会改变屏幕分辨率?或者等效地,如果SetForegroundWindow(hWnd)是全屏应用程序?我想等到决议更改完成,或者如果没有变化,立即进行。

屏幕分辨率更改是异步完成的,函数调用在它发生之前就会很好地返回,所以我的代码过早运行,并将我的应用程序绘制到全屏应用程序的表面上,尺寸错误,然后在分辨率更改后,它看起来特别难看。

如果有人有兴趣,我的申请来源是https://bitbucket.org/FrigoCoder/frigotab/src

为了澄清,我更感兴趣的是事先知道是否发生分辨率变化而不是稍后检测。我已经知道了一个半解决方案,我在hWnd或其他窗口呼叫SetForegroundWindow()并观看GetDesktopWindow()SystemEvents.DisplaySettingsChanging。但是,如果发生分辨率更改,这只会给我一个迟到的异步通知,而不会告诉我它是否会发生。

2 个答案:

答案 0 :(得分:2)

我设法解决了这个问题。我只是向前台应用程序发送一个失活消息,而不是尝试检测全屏应用程序,这会触发早期的分辨率更改:

SendMessage(GetForegroundWindow(), WM_ACTIVATEAPP, false, GetCurrentThreadId());

这个完全相同的消息也在应用程序切换期间发送,所以我基本上在实际发生之前模拟一个消息。我还没有遇到任何副作用。

但请注意,这确实解决了DWM问题。 Windows 7会自动禁用DWM组合以启动兼容性,或者当它检测到对主显示表面的直接访问时。它不允许您重新启用,我看不到这个问题的简单解决方案。值得庆幸的是,由于在Windows 8及更高版本中始终启用DWM组合,因此该问题最终会消失。

答案 1 :(得分:0)

也许Winforms事件SizeChanged可以帮助您。

您可以将此事件用作其余代码的继续排序。如果由于没有调整大小而事件没有触发,则可以在指定的超时后运行辅助延续。它并不完美,但可能满足您的需求。