Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以向Win32 GUI中的WindowProcedure发送自定义消息?_C++_Winapi_Win32gui - Fatal编程技术网

C++ 是否可以向Win32 GUI中的WindowProcedure发送自定义消息?

C++ 是否可以向Win32 GUI中的WindowProcedure发送自定义消息?,c++,winapi,win32gui,C++,Winapi,Win32gui,如果我问了一些可笑的问题(我是win32 noob),我很抱歉,但我想知道这是否会发生。我们是否可以根据自己的情况更改消息,并在开关(消息)中按照代码处理它 LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message){ case WM_DESTROY: PostQui

如果我问了一些可笑的问题(我是win32 noob),我很抱歉,但我想知道这是否会发生。我们是否可以根据自己的情况更改消息,并在开关(消息)中按照代码处理它

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;
}

您可以定义新消息:

#define WM_MY_MSG (WM_USER+0)

注意,WM_USER+x范围内的消息对于窗口类是私有的,而应用程序私有消息则需要位于WM_APP+x范围内。 然后使用
SendMessage
PostMessage
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;
}

案例FindWindowA
没有意义。尽管您可以对自定义消息使用WM_用户消息或类似消息。switch语句中的大小写值必须是常量表达式。函数的返回值不是。因此,不,您不能使用类似此代码的任何内容(即使您将
FindWindowA(…)
替换为返回消息标识符的内容)。
WM\u USER+x
范围内的消息对window类是私有的。应用程序私人消息需要在
WM_APP+x
范围内。注册的消息是公共应用程序消息。@IInspectable是,它是正确的。已经在帖子中添加了更新。这没有多大帮助。窗口类私有消息只有在它们是窗口类公共接口(如Windows的公共控件)的一部分时才能安全地发送。另一方面,应用程序私有消息是真正私有的。向既没有记录顶层窗口类也没有记录应用程序私有消息的应用程序(如tastmanager)发送任何一种类型都将失败。在某种程度上,这通常是不可诊断的。那么,我如何才能持续地将信息发送到窗口?什么是“持续”呢?循环?您可以随时向窗口发送消息(使用
SendMessage
PostMessage
功能)。
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;
}