【问题标题】:How to SendMessage如何发送消息
【发布时间】:2011-02-13 10:04:35
【问题描述】:

我有问题。我希望在我的程序(跟随代码)中有 2 个窗口:控制台和空表单来输出图形。并从我的 func main 发送消息以形成绘制形状。向控制台输入数据。但是 func SendMessage() 不起作用。怎么了?

int main()
{
 char szClassName[] = "CG_WAPI_Template";
 HWND hWnd = GetConsoleWindow();
 HINSTANCE hInstance = NULL;
 MSG lpMsg;

 if(!AllocConsole())
  MessageBox(NULL, "Failed to create the console!", "Ошибка", MB_ICONEXCLAMATION|MB_OK);

  void *h_inc = GetStdHandle(STD_INPUT_HANDLE);
  void *h_out = GetStdHandle(STD_OUTPUT_HANDLE);

  WNDCLASS wc;
 /*wc.style       = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc   = WndProc;
 ...
*/


 if(!RegisterClass(&wc))
 {MessageBox(NULL, "Не могу зарегистрировать класс окна!", "Ошибка", MB_OK);
  return 0;
 }

 hWnd = CreateWindow(...); 

 ShowWindow(hWnd, SW_MAXIMIZE); 
 UpdateWindow(hWnd);

 char buf[2];
 unsigned long lengh;
 ReadConsole(h_inc,buf,1,&lengh,NULL);

 SendMessage(hWnd, WM_USER+2, 0, 0); 

 if(GetMessage(&lpMsg, NULL, 0, 0))  
 {
  TranslateMessage(&lpMsg);
  DispatchMessage(&lpMsg);
 }

 ReadConsole(h_inc,buf,1,&lengh,NULL);

 if (!FreeConsole())
  MessageBox(NULL, "Could not free the console!", "Ошибка", MB_OK);

 return 0;
}

谢谢。

【问题讨论】:

  • SendMessage 的错误是什么?
  • 没有错误 - 程序挂起并且消息的情况没有执行。

标签: c++ windows forms console sendmessage


【解决方案1】:

SendMessage 函数在消息被窗口处理之前不会返回。您需要有一个事件循环才能处理消息。找教程here。

在您的事件循环中,您必须处理两个窗口的消息:控制台窗口和 GUI 窗口。对于控制台消息,您需要处理按键事件,并将您的自定义消息 (WM_USER + X) 发送到 GUI 窗口。

【讨论】:

  • 不正确。 SendMessage 直接调用窗口过程,它不进入队列。您当然不需要多个事件循环。
  • 是的,不是多个事件循环,而是在事件循环中处理两个窗口。在代码 sn-p 中,OP 提供了他发送自定义用户消息:SendMessage(hWnd, WM_USER+2, 0, 0); 将为该消息调用哪个过程?
  • 直接调用 hWnd 的窗口过程。是同步的。更重要的是,消息循环可以处理您想要创建的尽可能多的不同窗口句柄。这就是自诞生以来数以百万计的程序使用的规范消息循环(好吧,至少是 1985 年的 Windows 1.0)!
  • 控制台和表单的句柄是一样的!因为一个程序有两个窗口。你能给我代码的例子吗?我没有准确地想象它是什么样子的。
  • @kill:你是什么意思他们是一样的?您只是不保留控制台窗口的句柄,而是用 GUI 窗口的句柄覆盖它。
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2020-11-18
  • 2019-04-27
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多