虽然没有OpenCV API来检索聚焦窗口,但是OS GUI Shell通常提供。使用这种方法会更好,因为鼠标回调不能检测ALT-TAB和编程聚焦。 下面是python for windows的一些示例代码,可以完成这项工作:
import ctypes
import cv2
user32 = ctypes.windll.user32
def exists_cv_window(title):
# seems to work on python-opencv version 4.6.0
return cv2.getWindowProperty(title, cv2.WND_PROP_VISIBLE) != 0.0
def get_active_cv_window():
focused_window_handle = user32.GetForegroundWindow()
length = user32.GetWindowTextLengthW(focused_window_handle)
buffer = bytes([0]) * 2 * length
buff_pointer = ctypes.c_char_p(buffer)
user32.GetWindowTextW(window_handle, buff_pointer, length)
active_window_title = buffer.decode('utf-16')
if exists_cv_window(active_window_title):
return active_window_title
# example use case for the function
def main():
im1 = cv2.imread('cookie.png')
im2 = cv2.imread('cat.png')
cv2.imshow('figure 1', im1)
cv2.imshow('figure 2', im2)
while True:
key = cv2.waitKey(10)
if key == 23: # CTRL + W
title = get_active_cv_window()
if title is not None:
cv2.destroyWindow(title)
# in the example above the ability to target active window allows applying
# CTRL + W shortcut to a specific figure
4条答案
按热度按时间hmtdttj41#
在OpenCV中没有函数可以实现这一点,但是,
cvSetMouseCallback()
的签名允许您为每个窗口注册一个回调函数。您必须注册单独的回调函数来完成您需要做的事情。
以下是HIGHGUI模块支持的complete list功能。
另一个(hardcore)替代方案是深入研究你正在使用的操作系统的原生API,并搜索实现这一点的方法。问题是这个解决方案不是跨平台的。
tzxcd3kk2#
实际上,cvGetWindowHandle(const char* windowname)在opencv/highgui/highgui_c. h中是可用的。在编写此答案之前,它一直可用到openCV 4。
我建议你加上
并使用
mctunoxg3#
包含〈opencv / highgui /highgui_c. h〉可能是一个解决方案,但它确实不会让您转向Opencv 4+。
对于那些仍在MFC对话框中使用OpenCV的人,有一种不同的解决方案
FindWindows返回父窗口句柄,MFC处理子窗口,因此您将需要FindWindow和FindWindowEx。
MFC和Opencv 4+的新源代码
也许您仍然遇到麻烦,因为string到LPCWSTR的转换失败,并且hParent返回NULL。有许多方法可以将string转换为LPCWSTR,但是由于您使用的是MFC,请尝试
新代码应替换此旧代码
试试看,
qltillow4#
虽然没有OpenCV API来检索聚焦窗口,但是OS GUI Shell通常提供。使用这种方法会更好,因为鼠标回调不能检测ALT-TAB和编程聚焦。
下面是python for windows的一些示例代码,可以完成这项工作:
可惜这不是OpenCV的一部分