【问题标题】:Is it possible to send a custom message to the WindowProcedure in Win32Gui?是否可以向 Win32Gui 中的 WindowProcedure 发送自定义消息?
【发布时间】:2020-08-11 02:39:50
【问题描述】:

如果我问了一些荒谬的问题(我是win32菜鸟),我很抱歉,但我想知道它是否会发生。我们是否可以根据自己更改消息并在开关(消息)中将其处理为在代码中?

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

      switch (message){      

          case WM_DESTROY:
              PostQuitMessage(0);
              break;

          case FindWindowA(NULL,"Task Manager"): // like this 
              //do something
              break;

          default:
              return DefWindowProc(hwnd,message,wParam,lParam);

      } 

      return 0;
}

【问题讨论】:

  • case FindWindowA 没有意义。尽管您可以为自定义消息使用 WM_USER 消息或类似消息。 https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-user
  • switch 语句中的 case 值必须是常量表达式。函数的返回值不是。因此,不,您不能使用类似此代码的任何内容(即使您将 FindWindowA(...) 替换为返回消息标识符的内容)。

标签: c++ winapi win32gui


【解决方案1】:

您可以定义新消息:

#define WM_MY_MSG (WM_USER+0)

#define WM_MY_MSG (WM_APP+0)

请注意,WM_USER + x 范围内的消息是窗口类私有的,而应用程序私有消息需要在 WM_APP + x 范围内。 比使用SendMessagePostMessage API 函数将此消息发送到具有已知处理程序(hwnd)的窗口。 并进一步处理:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

      switch (message){      

          case WM_DESTROY:
              PostQuitMessage(0);
              break;

          case WM_MY_MSG: // like this 
              // Do something, for example FindWindowA(NULL,"Task Manager")
              break;

          default:
              return DefWindowProc(hwnd,message,wParam,lParam);

      } 

      return 0;
}

【讨论】:

  • WM_USER + x 范围内的消息是窗口类私有的。应用程序私有消息需要在WM_APP + x 范围内。注册消息是公共应用消息。
  • @IInspectable 是的,它是正确的。已添加更新帖子。
  • 这没有多大帮助。 Window-class-private 消息只有在它们是窗口类的公共接口(如 Windows 的公共控件)的一部分时才能安全地发送。另一方面,应用程序私有消息是真正私有的。将任一类型发送到既没有记录其顶级窗口类,也没有记录其应用程序私有消息的应用程序(如 Tast Manager)将失败。以一种通常无法诊断的方式。
  • 那么我怎样才能不断地把我的消息发送到窗口呢?
  • 什么是“连续”?在一个循环?可以随时向窗口发送消息(使用SendMessagePostMessage 函数)。
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2012-08-05
  • 2013-01-18
  • 2020-10-26
相关资源
最近更新 更多