我在主窗口中创建了几个按钮(窗口),但是标签和箭头键不起作用。我的研究表明,对于C ++,在消息泵中使用IsDialogMessage创建了TranslateMessage / DispatchMessage的旁路,如下所示,以允许此功能:
while(GetMessage(&Msg, NULL, 0, 0))
{
if(!IsDialogMessage(g_hToolbar, &Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
但是,我使用python和win32gui模块来创建CreateWindows,我无法弄清楚如何绕过正常的消息捕获以允许自然处理键盘。我的代码与此类似:
from win32gui import *
from win32con import *
window_class = WNDCLASS()
hinst = window_class.hInstance = GetModuleHandle(None)
window_class.lpszClassName = 'ClassName'
window_class.style = CS_VREDRAW | CS_HREDRAW
window_class.hCursor = LoadCursor(0, IDC_ARROW)
window_class.hbrBackground = COLOR_WINDOW
window_class.lpfnWndProc = {}
classAtom = RegisterClass(window_class)
hwnd = CreateWindow(classAtom, "", WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION
| WS_SYSMENU | WS_MINIMIZEBOX | WS_EX_TOPMOST | WS_CLIPSIBLINGS,
0, 0, 140, 100, 0, 0, GetModuleHandle(None), None)
btn1_hwnd = CreateWindow("Button", "btn 1", WS_GROUP | WS_TABSTOP | WS_VISIBLE
| WS_CHILD | BS_DEFPUSHBUTTON | WS_CLIPSIBLINGS,
10, 10, 100, 20, hwnd, 0, GetModuleHandle(None), None)
btn2_hwnd = CreateWindow("Button", "btn 2", WS_GROUP | WS_TABSTOP | WS_VISIBLE
| WS_CHILD | BS_DEFPUSHBUTTON | WS_CLIPSIBLINGS,
10, 40, 100, 20, hwnd, 0, GetModuleHandle(None), None)
UpdateWindow(hwnd)
PumpMessages()
编辑:使用此代码,会创建一个带有两个按钮的窗口,但不能将焦点从一个移动到另一个,尽管它们都有WS_TABSTOP标记。
根据MSDN IsDialogMessage specification,上面的C ++代码段是解决方案。
当IsDialogMessage处理消息时,它会检查键盘消息并将其转换为相应对话框的选择。例如,按下TAB键时,选择下一个控件或一组控件,按下DOWN ARROW键,选择组中的下一个控件。
由于IsDialogMessage函数执行所有必要的消息转换和分派,因此不能将IsDialogMessage处理的消息传递给TranslateMessage或DispatchMessage函数。
所以,基本上,问题是:可以从Python的win2gui中使用IsDialogMessage
,还是有一些解决方法?
答案 0 :(得分:1)
我在CreateDialogIndirect上找到了programcreek.com用法的示例,它创建了一个类似于问题窗口的窗口,标签可以正常工作。在这里,稍作修改:
import win32con
import win32gui
import win32api
parent_hwnd = None
msgs = {}
style=win32con.WS_BORDER|win32con.WS_VISIBLE|win32con.WS_CAPTION|win32con.WS_SYSMENU ## |win32con.DS_SYSMODAL
h=win32gui.CreateDialogIndirect(
win32api.GetModuleHandle(None),
[['One ugly dialog box !',(100,100,200,100),style,0],
['Button','Create', win32con.IDOK, (10,10,30,20),win32con.WS_VISIBLE|win32con.WS_TABSTOP|win32con.BS_HOLLOW|win32con.BS_DEFPUSHBUTTON],
['Button','Never mind', win32con.IDCANCEL, (45,10,50,20),win32con.WS_VISIBLE|win32con.WS_TABSTOP|win32con.BS_HOLLOW],
['Static','Desktop name:',71,(10,40,70,10),win32con.WS_VISIBLE],
['Edit','',72,(75,40,90,10),win32con.WS_VISIBLE]],
parent_hwnd, msgs)
win32gui.EnableWindow(h,True)
hcontrol = win32gui.GetDlgItem(h,72)
win32gui.EnableWindow(hcontrol,True)
win32gui.SetFocus(hcontrol)
win32gui.PumpMessages()
答案 1 :(得分:0)