我正在尝试使用 win32 API 在按钮单击事件中打开已打开的记事本应用程序的“打开文件对话框”。这是代码:
void onButonClicked()
{
HWND hWnd = ::FindWindow(NULL, L"Untitled - Notepad");
HMENU hWndMenu = ::GetMenu(hWnd);
HMENU hWndSubMenu = ::GetSubMenu(hWndMenu, 0);
SendMessage(hWnd, WM_COMMAND, GetMenuItemID(hWndSubMenu, 1), 0);
}
这工作正常并打开“打开对话框”。但它卡住了我的应用程序。如果我尝试用鼠标移动我的应用程序窗口,它会挂起并在标题栏上显示“无响应”。我也试过在一个单独的线程中打开这个对话框窗口,但没有成功。如何解决这个问题?
最佳答案
您向我们展示的代码看起来像是您想要控制记事本: 它阻塞的原因很简单。 SendMessage 将 WM_COMMAND 消息发送到 NOTEPAD 并等待它被处理。 Notpad 本身接收 WM_COMMAND 消息并显示文件打开对话框并等待用户输入。
这一切都是在 WM_COMMAND 消息的处理中完成的,SendMessage 只会在处理完成后返回。因此,要么用户中止对话框,要么他选择一个文件并打开该文件。
PS:你的问题不够详细,你到底想做什么。
关于c++ - Win32 API : App Freezes after opening dialog window,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31981066/