【发布时间】:2021-07-07 17:37:02
【问题描述】:
我在运行 Windows 10 的笔记本电脑上使用 VS 2019 开发 W32 应用程序。
我编写了一个实用函数,该函数将一系列文本字符串写入调用应用程序的主窗口,同时所述函数播放一个 wav 文件。目的是将代表歌词的各种文本字符串的增量显示与 wav 文件中的相应乐句相协调。曲子完成后,应用程序将关闭。
虽然很粗糙,但在 VS2019 IDE 中执行宿主应用程序的调试或发布版本时,该功能按预期执行。
同样,当从 Windows 资源管理器或桌面图标调用主机应用程序的执行时,只要用户在执行功能时没有单击鼠标左键,应用程序就会按预期运行。然而,
-
如果在鼠标指针位于桌面或其他窗口上方时单击鼠标左键,乐曲会继续播放,但应用程序会停止写入后续的歌词字符串。曲子完成后,应用程序按预期关闭。
-
如果在鼠标悬停在应用窗口上时单击按钮,则应用的行为方式与在窗口标题栏中添加“(未响应)”的方式相同。
-
wav 文件功能是最近对该功能的增强。我不认为此异常与所述功能有关,因为在合并 wav 文件增强之前异常也同样表现出来。
以下是实用函数的相关代码段。
有没有人知道这个异常的原因以及如何解决这个异常?我试过这样的选择
- 禁用主机应用 HWND。
- 在子窗口中执行函数。
- 在函数中将焦点设置到桌面。
运气不好。
感谢您的参与。
更新:之前提供的示例代码已替换为以下单个代码模块,该模块在构建为 Win32 应用程序时会显示异常。顺便说一句,这个网站的编辑功能不允许我删除旧代码——因此,我之前关于无法编辑的评论。但是,它确实允许我粘贴原始代码 sn-p。
enter code here
//---------------------------------------------------------------
// TEST_Goodbye.cpp : App to demonstrate anomaly in function
// LongGoodbye.
//---------------------------------------------------------------
#include "framework.h"
#include <math.h>
#include "TEST_Goodbye.h"
#define MAX_LOADSTRING 100
#define IDC_PUSHBUTTON 160
// Global Variables:
HINSTANCE hInst; // current instance
WCHAR szTitle[MAX_LOADSTRING]; // The title bar text
WCHAR szWindowClass[MAX_LOADSTRING]; // the main window class na
// Forward declarations of functions included in this code module
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
//=====================================================
// Function LongGoodbye.
//=====================================================
void LongGoodbye(
HDC hdc
)
{
HWND hWnd = WindowFromDC(hdc);
RECT Rect;
int k;
int kk = 8;
int color[3] = { 32,128,32 } ; // Rich forest green.
int Delay[] = { 700, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
1400, 1400, 1400, 1400, 4200 };
COLORREF BackGroundColor = RGB(color[0],color[1],color[2]);
const char *szFarewellMessage[12] = { // vs2019
"Farewell."
, "Adieu."
, "A German phrase, goodbye-high."
, " "
, "How sad"
, "you will"
, "not give this App a try-high!"
, " "
, "Goodbye."
, " "
, "Good-byyyyyyyyyyyyyyyyyye."
, " "
};
//-------------------------------------------------------------
//
//-------------------------------------------------------------
//X PlaySound(L"SoLongFarewell_v06", hInst
//X , SND_RESOURCE | SND_ASYNC);
GetClientRect(hWnd, &Rect);
Rect.top = kk;
Rect.bottom = Rect.top + 2 * kk;
for (k=0; k<12; k++)
{
SetFocus(hWnd);
Sleep(int(floor(0.875*Delay[k])));
SetBkMode (hdc,TRANSPARENT);
DrawTextA(
hdc
, (char*)szFarewellMessage[k]
, -1
, &Rect
, DT_CENTER | DT_VCENTER | DT_NOCLIP
);
Rect.top += kk; // Half line-height spacing after empty t
// line.
Rect.bottom += kk;
if (strlen(szFarewellMessage[k]) >1)
{
Rect.top += kk; // Full line-height spacing after non-emp
// text line.
Rect.bottom += kk;
}
}
Sleep(int(floor(0.875*Delay[12])));
SendMessage (hWnd, WM_DESTROY, 0, 0L) ;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow
)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// Initialize global strings
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_TESTGOODBYE, szWindowClass,
MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
return FALSE;
HACCEL hAccelTable = LoadAccelerators(hInstance,
MAKEINTRESOURCE(IDC_TESTGOODBYE));
MSG msg;
// Main message loop:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//---------------------------------------------------------------
// FUNCTION: MyRegisterClass()
//---------------------------------------------------------------
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance,
MAKEINTRESOURCE(IDI_TESTGOODBYE));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_TESTGOODBYE);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance,
MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
//---------------------------------------------------------------
// FUNCTION: InitInstance(HINSTANCE, int)
//---------------------------------------------------------------
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global varia
HWND hWnd = CreateWindowW(szWindowClass, szTitle,
WS_OVERLAPPEDWINDOW,
20, 20, 300, 300, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//---------------------------------------------------------------
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//---------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam
, LPARAM lParam)
{
static HWND hPB = NULL;
static HDC hdc = NULL;
switch (message)
{
//****message************************************************
case WM_CREATE:
{
//---------------------------------------------------------
// Create Goodbye Button.
//---------------------------------------------------------
RECT Rect;
GetClientRect(hWnd,&Rect);
hPB = CreateWindow(
L"button"
, L"Goodbye"
, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON
, 6
, Rect.bottom-36
, 180
, 30
, hWnd
, (HMENU)IDC_PUSHBUTTON
, hInst
, NULL
);
ShowWindow(hPB,SW_SHOW);
}
return 0; // END case WM_CREATE:
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd,
About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDC_PUSHBUTTON:
hdc = GetDC(hWnd);
LongGoodbye(hdc);
ReleaseDC(hWnd,hdc);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code that uses hdc here...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam
, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
【问题讨论】:
-
您发布的内容与鼠标左键无关。请提供minimal reproducible example
-
您断言问题与我的鼠标左键无关,这让我感到困惑。请解释。此外,我准备并验证了一个代码模块,该模块演示了鼠标左键单击和所描述的异常之间的严格可重复的 100%“当且仅当”相关性。我如何发布它?该场所不允许我编辑我的原始帖子,也没有足够的空间将其作为此评论的一部分发布。
-
我从来没有说过你的问题与鼠标左键无关。我说你没有发布任何与鼠标左键相关的代码,并要求你发布minimal reproducible example。还在等待。
-
而且,我如何发布我的“最小可生产示例”?请指教。
-
看到编辑按钮了吗?
标签: c++ visual-studio mouse