Linux与Windows中的窗口消息过程

时间:2009-02-08 15:49:38

标签: c++ windows linux cross-platform

在Windows中创建窗口时,必须定义(c ++)

LRESULT CALLBACK message_proc(HWND Handle, UINT Message, WPARAM WParam, LPARAM LParam);

处理从操作系统发送到窗口的所有消息,如按键等。

我正在寻找关于Linux中同一系统如何工作的一些阅读。也许是因为我在术语上略显缺乏,但我没有通过谷歌找到任何东西(虽然我肯定必须有足够的!)。

  • 它仍然只是一个C函数来处理所有通信吗?
  • 功能定义是否在不同的WM(Gnome,KDE)上有所不同,还是在操作系统的较低级别处理?

编辑:我已经研究过像QT和WxWidgets这样的工具,但这些框架似乎更倾向于开发GUI广泛的应用程序。我正在寻找一种方法来为我的OGL图形创建一个基本窗口(限制调整大小,边框/装饰)并在多个平台上检索输入。根据我最初的研究,这种函数是检索输入的唯一方法。

最佳路线是什么?阅读,学习然后使用QT或WxWidgets?或者学习系统如何工作并实现我想要的那些基本功能?

4 个答案:

答案 0 :(得分:7)

在最基本的层面上你有X Window协议http://en.wikipedia.org/wiki/X_Window_System_core_protocol,如果你想做任何应用程序,我们可能会非常复杂。接下来在堆栈上有Xlib http://en.wikipedia.org/wiki/Xlib,它是围绕X协议的“方便”包装器,但对于“现实生活”应用程序仍然很复杂。在Xlib之上构建了大多数其他框架,试图简化应用程序开发。最知道的是:Xt,Gtk,Qt等。

就像在窗口中一样,你有一个“事件循环”,如果你想要,你可以在它上面实现一个GetMessage / DispachMessage隐喻来模仿windows的行为。这样你可能有一个WNDPROC,但本身X不提供这样的东西。

在重新发明轮子之前,最好先看看他们正在使用的类似应用程序。

如果您需要简单的东西,可以尝试SDL http://www.libsdl.org/,它是一个跨平台库,旨在开发游戏/简单应用程序。另一种选择是Allegro游戏库http://www.talula.demon.co.uk/allegro/

答案 1 :(得分:5)

这完全是完全不同的。该窗口过程100%特定于Windows操作系统。对于linux,它将取决于窗口管理器(gnome,kde - 正如你已经提到的那样)。如果您希望进行跨平台开发,您可能需要查看QT之类的内容。

您可能希望查看以下网址:

http://www.qtsoftware.com/products/appdev
http://en.wikipedia.org/wiki/Qt_toolkit

答案 2 :(得分:4)

原则上它完全一样。但是,它与操作系统的通信无关(在win32上也没有,使用user32.dll完全是可选的)

GUI应用程序在某处有一个事件循环,它在某个级别处理来自队列的消息。

有很多库通常用于“隐藏”此行为 - 您可以使用它们(实际上,您应该使用它们)。如果有的话,Xlib事件系统甚至比Win32的user32.dll更不正常,并且不太被广泛理解,因此更少人直接使用它。


在Linux或Windows中,应用程序可以使用低级GUI,也可以使用库。大多数人使用图书馆。应用程序也可以选择既不执行也不运行GUI(服务器应用程序通常这样做)。应用程序可以创建多个线程,其中一个位于事件循环中,而其他线程的工作方式不同。这也是一种流行的方法。

  • 大多数GUI应用程序使用更高级别的库作为其GUI
  • 非交互式应用程序,例如服务器应用程序,根本不使用GUI而不使用库(例如XLib,user32.dll)
  • 不适合“事件循环”(例如游戏)的应用程序通常使用单独的线程来处理其事件循环。
  • 这些在Win32和Linux上基本上都是正确的。

答案 3 :(得分:2)

正如xhantt所述,您正在寻找的等效消息的传输是X Window系统。实际上,这可能有点复杂。

使用XLib,您需要在主循环中处理事件注册和出列。有关如何继续的完整说明,请参阅XLib manual。但是不要忘记你只会捕捉窗口并以这种方式输入事件。不是每个OS消息。

您还可以查找XCB这是一个更新,可能更简单的库。

如果您在这两个库之上构建应用程序,它将在每个WM下(几乎,我们永远不会太确定)顺利运行。并且您不需要任何大多数Linux用户在安装时尚未拥有的依赖项。如果你使用Qt,GTK等...它将更容易并且在任何WM下工作,但它们可能没有安装库。