Linux 如何使用GTK、XLib或任何类似工具将一个程序嵌入到另一个程序中?
我试图制作一个“简单”的程序,它所做的只是列出所有打开的程序,一旦你选择了一个,它就会在你的窗口中打开它(就像你可能说的缩略图,但你也可以进行交互) 有一件事,它必须是单向的(例如,我不能改变经过修饰的程序并添加“socket”或“plug”)。我想能够演示任何程序(例如Opera、evince、JDownloader等) 有人知道我该怎么做吗Linux 如何使用GTK、XLib或任何类似工具将一个程序嵌入到另一个程序中?,linux,gtk,embed,xlib,Linux,Gtk,Embed,Xlib,我试图制作一个“简单”的程序,它所做的只是列出所有打开的程序,一旦你选择了一个,它就会在你的窗口中打开它(就像你可能说的缩略图,但你也可以进行交互) 有一件事,它必须是单向的(例如,我不能改变经过修饰的程序并添加“socket”或“plug”)。我想能够演示任何程序(例如Opera、evince、JDownloader等) 有人知道我该怎么做吗 如果不能使用GTK完成,可以使用X或任何类似工具完成吗?怎么做?看来您正在寻找类似XEmbed的产品。python和gtk的一个很好的教程是在上,你可以
如果不能使用GTK完成,可以使用X或任何类似工具完成吗?怎么做?看来您正在寻找类似XEmbed的产品。python和gtk的一个很好的教程是在上,你可以使用它。谢谢,我稍后会看一看,然后再给你回复。我认为这对我没有帮助,我想在任何程序中都这样做,我不能在其中放套接字。我明白了,你想要一个类似迷你窗口管理器的程序。您可能需要与正在运行的窗口管理器进行通信。根据WM的运行情况,这可能需要以不同的方式完成。实际上,给定windows的缩略图,您可以使用XSendEvent()来模拟用户交互。不过,如果程序使用指针抓取,就会出现问题,因为它会突然得到屏幕坐标,而不是你翻译的坐标。为了让问题更清楚,我改变了我的问题。我不能修改embbed程序,我想制作一个嵌入任何其他程序(Opera、evince等)的程序。
using System;using Gtk;using System.Runtime.InteropServices; public partial class MainWindow : Gtk.Window{
public MainWindow () : base(Gtk.WindowType.Toplevel)
{
Gtk.Socket socket;
int xid;
Fixed fixed2=new Fixed();
this.socket = new Socket();
this.socket.WidthRequest = 500;
this.socket.HeightRequest = 500;
this.socket.Visible = true;
this.socket.Realized += new EventHandler(OnVideoWidgetRealized);
fixed2.Put(socket, 0, 0);
fixed2.SetSizeRequest(500,500);
this.Add(fixed2);
this.ShowAll();
OnButton17Clicked();
}
protected virtual void OnVideoWidgetRealized (object sender, EventArgs
args)
{
this.xid = (int)socket.Id;
Console.WriteLine("this.xid:"+this.xid);
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
this.socket = new Socket();
}
protected void OnButton17Clicked ()
{
var paramString = string.Format("-wid {0} 1.avi", xid);
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "mplayer.exe";
proc.StartInfo.Arguments = paramString;
proc.Start();
proc.WaitForExit();
}
public static void Main()
{
Application.Init();
new MainWindow();
Application.Run();
}}