c#窗口里有什么好玩的qt 控件充满整个窗口

大家可以到()找到最新的源码下载。
这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上&&跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题)。
在codeproject找到了一篇相关的文章(),虽然可用,但是很不方便,于是重新设计编写了一个类库,用一个控件完成内嵌其它应用程序的功能。
直接上图先:
从打开Adobe Reader那张图片可以看出来所谓的&内嵌程序和宿主程序的窗口激活状态问题&。当内嵌程序窗口激活时,表面上将其包裹起来的宿主窗口却处于非激活的状态。想隐藏这一点的话,把窗口的FormBorderStyle属性设为None吧,然后自己在窗口上画关闭、最大化、最小化按钮好了。
原作者的实现思路更能暴露本质,所以这里用原作者的代码段解释一下实现过程。
1、启动要嵌入的应用程序进程
1 Process p = null;
// Start the process
p = System.Diagnostics.Process.Start(this.exeName);
// Wait for process to be created and enter idle condition
p.WaitForInputIdle();
// Get the main handle
appWin = p.MainWindowH
13 catch (Exception ex)
MessageBox.Show(this, ex.Message, "Error");
2、调用Windows API将启动的应用程序窗口嵌入自定义的控件(作者用的是Panel控件)
1 // Put it into this form
2 SetParent(appWin, this.Handle);//this在这里是Panel控件
4 // Remove border and whatnot
5 SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
7 // Move the window to overlay it on this window
8 MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
3、设置被嵌入的窗体大小随宿主窗体改变
1 protected override void OnResize(EventArgs e)
if (this.appWin != IntPtr.Zero)
MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
base.OnResize (e);
4、设置被嵌入的窗体应用程序在宿主程序关闭时也关闭
1 protected override void OnHandleDestroyed(EventArgs e)
// Stop the application
if (appWin != IntPtr.Zero)
// Post a colse message
PostMessage(appWin, WM_CLOSE, 0, 0);
// Delay for it to get the message
System.Threading.Thread.Sleep(1000);
// Clear internal handle
appWin = IntPtr.Z
base.OnHandleDestroyed (e);
原作者的代码实际用起来是很不方便的,具体大家试试就知道,不细说了(反正我只学了学上面的步骤,也不用他的库)。
本人开发了一个比较实用的控件,使用起来也很简单,只需三步。
首先,在窗体应用程序项目中引用类库SmileWei.EmbeddedApp。
然后,在宿主窗体上拖一个AppContainer控件,摆放好位置。(如果工具箱里没有AppContainer,就F6生成解决方案一下,然后再看就有了。)
最后,告诉AppContainer控件,要嵌入的应用程序(*.exe文件)的绝对路径(本人以使用OpenFileDialog为例),命令AppContainer控件启动之。
1 appContainer1.AppFilename = openEXE.FileN
2 appContainer1.Start();
这个AppContainer控件有什么好处呢?
1、原作者想到的Resize和随宿主程序关闭而关闭的问题,AppContainer都实现了。
2、AppContainer指定要嵌入的应用程序和启动是分开的,这样更灵活,开发过程中也不会看到如下的情况了:开发的时候原作者的控件就&情不自禁&地把内嵌程序加载进来了。
3、AppContainer防范了各种可能出错的情形,例如禁止自己嵌入自己(死循环)、内嵌Console程序时提示不能嵌入、参数为null或无效的检验等。
4、其它。例如,AppContainer里面不会使用Thread.Sleep(1000);这样低端的句子来保证程序正确地嵌入(而且对于类似photoshop这样启动很慢的程序也保证不了),而是通过Application.Ilde事件实现了在被嵌程序加载完毕后才将其窗体嵌入的技巧。
当然,有些应用程序是不能这么自动化地嵌入进来的。因为程序启动窗体和主窗体句柄不一样,AppContainer无法获得主窗体句柄,所以无法自动嵌入。
为了解决这个问题,我在宿主窗体的状态栏上设置了&句柄嵌入&标签,点击&句柄嵌入&,你可以填入想嵌入的应用程序主窗体句柄,然后宿主窗体就可以嵌入它了。
然后有同学就问了,我怎么知道想要嵌入的窗体句柄是多少啊?方法很多啦,我这里也提供一个自己制作的小程序,大家可以在这里下载:
界面是这个样子的:
里面&句柄:{1903014}&那一行就给出了本人正在用的Windows Live Writer的主窗体句柄。
用法很简单,启动这个程序后,它会自动检测鼠标所在位置的窗体信息,显示在窗口中。所以把鼠标放在你想了解的窗体菜单栏上就OK了。QQ TM版也可以这样嵌进来滴。(QQ嵌不进来,不知道腾讯在搞什么)
大家还可以试试把QQ对话框嵌进来,很好玩哦~
我的源代码都给出了明确的注释,类型、变量名也都规范易懂,在此不再多做解释了,有疑问请留言吧O(&_&)O
本文所有源代码、可执行程序均可在下面列出的链接中下载到。
示例宿主程序及类库源代码:
窗口侦探(用于查看窗口句柄):
大家可以到()找到最新的源码下载。
我添加了各种FormBorderStyle的示例App,用于演示这个属性对嵌入的影响。
转载请注明出处,O(&_&)O谢谢
阅读(...) 评论()安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&&&&& 这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上&&跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题)。
&&&& 在codeproject找到了一篇相关的文章(),虽然可用,但是很不方便,于是重新设计编写了一个类库,用一个控件完成内嵌其它应用程序的功能。
直接上图先:
从打开Adobe Reader那张图片可以看出来所谓的&内嵌程序和宿主程序的窗口激活状态问题&。当内嵌程序窗口激活时,表面上将其包裹起来的宿主窗口却处于非激活的状 态。想隐藏这一点的话,把窗口的FormBorderStyle属性设为None吧,然后自己在窗口上画关闭、最大化、最小化按钮好了。
原作者的实现思路更能暴露本质,所以这里用原作者的代码段解释一下实现过程。
1、启动要嵌入的应用程序进程
1 Process p = null;
// Start the process
p = System.Diagnostics.Process.Start(this.exeName);
// Wait for process to be created and enter idle condition
p.WaitForInputIdle();
// Get the main handle
appWin = p.MainWindowH
13 catch (Exception ex)
MessageBox.Show(this, ex.Message, "Error");
2、调用Windows API将启动的应用程序窗口嵌入自定义的控件(作者用的是Panel控件)
1 // Put it into this form
2 SetParent(appWin, this.Handle);//this在这里是Panel控件
4 // Remove border and whatnot
5 SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
7 // Move the window to overlay it on this window
8 MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
3、设置被嵌入的窗体大小随宿主窗体改变
1 protected override void OnResize(EventArgs e)
if (this.appWin != IntPtr.Zero)
MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
base.OnResize (e);
4、设置被嵌入的窗体应用程序在宿主程序关闭时也关闭
1 protected override void OnHandleDestroyed(EventArgs e)
// Stop the application
if (appWin != IntPtr.Zero)
// Post a colse message
PostMessage(appWin, WM_CLOSE, 0, 0);
// Delay for it to get the message
System.Threading.Thread.Sleep(1000);
// Clear internal handle
appWin = IntPtr.Z
base.OnHandleDestroyed (e);
原作者的代码实际用起来是很不方便的,具体大家试试就知道,不细说了(反正我只学了学上面的步骤,也不用他的库)。
本人开发了一个比较实用的控件,使用起来也很简单,只需三步。
首先,在窗体应用程序项目中引用类库SmileWei.EmbeddedApp。
然后,在宿主窗体上拖一个AppContainer控件,摆放好位置。(如果工具箱里没有AppContainer,就F6生成解决方案一下,然后再看就有了。)
最后,告诉AppContainer控件,要嵌入的应用程序(*.exe文件)的绝对路径(本人以使用OpenFileDialog为例),命令AppContainer控件启动之。
appContainer1.AppFilename = openEXE.FileN
appContainer1.Start();
这个AppContainer控件有什么好处呢?
1、原作者想到的Resize和随宿主程序关闭而关闭的问题,AppContainer都实现了。
2、AppContainer指定要嵌入的应用程序和启动是分开的,这样更灵活,开发过程中也不会看到如下的情况了:开发的时候原作者的控件就&情不自禁&地把内嵌程序加载进来了。
3、AppContainer防范了各种可能出错的情形,例如禁止自己嵌入自己(死循环)、内嵌Console程序时提示不能嵌入、参数为null或无效的检验等。
4、其它。例如,AppContainer里面不会使用Thread.Sleep(1000);这样低端的句子来保证程序正确地嵌入(而且对于类似 photoshop这样启动很慢的程序也保证不了),而是通过Application.Ilde事件实现了在被嵌程序加载完毕后才将其窗体嵌入的技巧。
当然,有些应用程序是不能这么自动化地嵌入进来的。因为程序启动窗体和主窗体句柄不一样,AppContainer无法获得主窗体句柄,所以无法自动嵌入。
为了解决这个问题,我在宿主窗体的状态栏上设置了&句柄嵌入&标签,点击&句柄嵌入&,你可以填入想嵌入的应用程序主窗体句柄,然后宿主窗体就可以嵌入它了。
然后有同学就问了,我怎么知道想要嵌入的窗体句柄是多少啊?方法很多啦,我这里也提供一个自己制作的小程序,大家可以在这里下载:
界面是这个样子的:
里面&句柄:{1903014}&那一行就给出了本人正在用的Windows Live Writer的主窗体句柄。
用法很简单,启动这个程序后,它会自动检测鼠标所在位置的窗体信息,显示在窗口中。所以把鼠标放在你想了解的窗体菜单栏上就OK了。QQ TM版也可以这样嵌进来滴。(QQ嵌不进来,不知道腾讯在搞什么)
大家还可以试试把QQ对话框嵌进来,很好玩哦~
我的源代码都给出了明确的注释,类型、变量名也都规范易懂,在此不再多做解释了,有疑问请留言吧O(&_&)O
本文所有源代码、可执行程序均可在下面列出的链接中下载到。
示例宿主程序及类库源代码:
示例宿主程序可执行文件(及必需的类库):
窗口侦探(用于查看窗口句柄):
原文地址:
阅读(...) 评论()随笔- 131&
参考资料:
如何在一个窗体中调用另一个窗体的控件或方法
答案是从构造函数中传递参数。
&要把Form1中的控间改成public属性 具体实现过程请参看一下代码(在form2的textbox1中输入然后在form1中的label1中显示textbox中的内容 //form1代码,form1中有一个label1和一个button1,其中label1的modifier属性为public namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //显示form2 Form2 f2 = new Form2(this); f2.Show(); } } } //form2代码,有一个textbox1,用于输入,有一个button1 namespace WindowsApplication1 { public partial class Form2 : Form { public Form2(Form1 parent) { InitializeComponent(); paf = } private Form1 paf; private void button1_Click(object sender, EventArgs e) { paf.label1.Text = textBox1.T this.Hide(); } } }
阅读(...) 评论()c#如何获得活动窗口内的控件_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
c#如何获得活动窗口内的控件
目的是实现从当前程序向另一个活动程序的焦点控件内输送文本信息,正常情况下哪个控件是可以接收从键盘输入信息的。我用Sendkey.Send 发送,可拒绝访问,晕。
被360封死了,但或许是我没说清楚,不知道有什么办法谢谢了。谢谢醉酒银虫的指教,一些游戏软件不接受Sendkeys,是指我发送的内容被拒绝访问而不是函数不能使用。目前已知道Sendkey.Send发的信息。有高手若知道获得活动窗口内的焦点控件的方法请指教.Send拒绝访问的原因却是哭笑不得,退出后就行了。还有我改用
SendMessage(pHwnd, 0x000C, (IntPtr)0, &aaaaaa&);时,则发到窗口标题中去了
我有更好的答案
.如果要求不高这个就能办到的.而SendMessage主要是向某个窗体.虽然功能很强力.进程什么的发送消息.在后台运行,但是特别麻烦.如果这样做,你首先要知道那个输入框的句柄然后再利用SendMessage发送消息我之前也做过类似的事.参考:
采纳率:39%
将控件设为public,然后就可以访问了。。 有个form的类的声明的文件。。
请说明你要实现的功能,举个例子。我能帮你解决。
比方说吧,发一个消息&早上好&到Word如何实现(不用Sendkeys.Send,用这个目前已实现,只是Word必须变为当前活动窗口,同时它有限制,某些游戏软件接收不到,比方说寻仙),谢谢!
其他1条回答
为您推荐:
其他类似问题
活动窗口的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;

我要回帖

更多关于 qt控件随窗口大小变化 的文章

 

随机推荐