1

这似乎是一个简单的问题,但我不知道将程序运行时执行的 Win32 代码放在哪里。作为一个简化的示例,我提供了一个示例,其中包含我认为是标准的 Win32 窗口初始化代码,然后是一个简单的“哔”命令。我曾尝试在不同的地方插入 beep 命令,但结果是以下三个之一:

  1. 哔哔声出现并无休止地循环
  2. 完全听不到哔哔声
  3. 只有在我关闭程序时才会发出哔声

我正在使用的代码如下所示。这只是我从在线资源中提取的一个示例,最后添加了我的 beep 命令。没有编译器错误。在此示例中,当我关闭程序时会发出哔声。如您所料,这是我的第一个 Win32 应用程序。

#include <windows.h>

    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";

    int WINAPI WinMain (HINSTANCE hThisInstance,
                HINSTANCE hPrevInstance,
                LPSTR lpszArgument,
                int nFunsterStil)

{
                    HWND hwnd;               /* This is the handle for our window */
                    MSG messages;            /* Here messages to the application are saved */
                    WNDCLASSEX wincl;        /* Data structure for the windowclass */

       /* The Window structure */
       wincl.hInstance = hThisInstance;
       wincl.lpszClassName = szClassName;
       wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
       wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
       wincl.cbSize = sizeof (WNDCLASSEX);

       /* Use default icon and mouse-pointer */
       wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
       wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
       wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
       wincl.lpszMenuName = NULL;                 /* No menu */
       wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
       wincl.cbWndExtra = 0;                      /* structure or the window instance */
       /* Use Windows's default color as the background of the window */
       wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

       /* Register the window class, and if it fails quit the program */
       if (!RegisterClassEx (&wincl))
               return 0;

       /* The class is registered, let's create the program*/
       hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Matt's Program That Beeps",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
            );

       /* Make the window visible on the screen */
       ShowWindow (hwnd, nFunsterStil);

       /* Run the message loop. It will run until GetMessage() returns 0 */
       while (GetMessage (&messages, NULL, 0, 0))
       {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
       }

       /* The program return-value is 0 - The value that PostQuitMessage() gave */
       return messages.wParam;
}

/*  This function is called by the Windows function DispatchMessage()  */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message)                  /* handle the messages */
 {
    case WM_DESTROY:
        PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
        break;
    default:                      /* for messages that we don't deal with */
        return DefWindowProc (hwnd, message, wParam, lParam);
}
    Beep( 750, 300 );              /* This is the beep command */
    return 0;
}
4

3 回答 3

2

在典型的 Windows 应用程序中,所有事情都是对消息循环中收到的消息的响应。如果您想在第一次打开窗口时发出一次哔声,您可以为 WM_CREATE 消息添加一个处理程序并将您的代码放在那里。

当您回复消息时,您需要尽快返回,以避免使 UI 反应迟缓或无响应。如果你需要做很多工作,你应该创建一个单独的线程来处理工作。

于 2011-05-06T13:26:39.980 回答
1

您将 Beep 调用放在 windows 消息回调中,它应该在窗口收到消息时触发(例如,调整大小、鼠标在 nc 区域等);所以它可能会触发很多。

您可以在单独的线程中运行您的代码(如果操作会很长)以避免冻结 GUI 作为一种解决方法,或者如果您想要一个单一的代码,那么您可以使用 WM_CREATE 案例消息来运行您的代码一次窗口被创建。

也检查一下

于 2011-05-06T13:23:03.320 回答
0

简单地说,如果您希望代码在每个窗口消息上运行(您可能不希望),那么将 beep 调用放在窗口 proc 的顶部。如果您希望它仅针对某些消息发生,case则为这些消息添加一个,并将其放在这种情况下。

于 2011-05-06T13:24:00.213 回答