winform的简单功能讨论,顶者有分

q198708wyp 2011-11-07 10:56:54
我想做个实现启动的exe添加到自己的控件中,比如说我启动酷狗音乐盒,添加到textbox控件,调整大小遮挡住酷狗的标题栏,自己再加个标题栏,让它看起来更像自己的东西。winform c# 。
...全文
170 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
yukai08621 2011-11-08
  • 打赏
  • 举报
回复
很有创意的想法
freemangood 2011-11-08
  • 打赏
  • 举报
回复
楼主实现了,就公布一下代码么

也不枉这么多人支持啊!
Daqing 2011-11-08
  • 打赏
  • 举报
回复
通过API的setwindows可以实现,测试有的可以,有的不行。如果你的exe可包含在窗体中,可以考虑做控件,然后组合在一个mainfrom里
 public partial class RunExeFile : Form
{
Process process = null;
IntPtr appWin;
private string exeName = "";

[DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]

private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


[DllImport("user32.dll", SetLastError = true)]
private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);


[DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
private static extern long GetWindowLong(IntPtr hwnd, int nIndex);


[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);

//private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

[DllImport("user32.dll", SetLastError = true)]
private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);

[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);

private const int SWP_NOOWNERZORDER = 0x200;
private const int SWP_NOREDRAW = 0x8;
private const int SWP_NOZORDER = 0x4;
private const int SWP_SHOWWINDOW = 0x0040;
private const int WS_EX_MDICHILD = 0x40;
private const int SWP_FRAMECHANGED = 0x20;
private const int SWP_NOACTIVATE = 0x10;
private const int SWP_ASYNCWINDOWPOS = 0x4000;
private const int SWP_NOMOVE = 0x2;
private const int SWP_NOSIZE = 0x1;
private const int GWL_STYLE = (-16);
private const int WS_VISIBLE = 0x10000000;
private const int WM_CLOSE = 0x10;
private const int WS_CHILD = 0x40000000;

public string ExeName
{
get{ return exeName; }
set{exeName = value;}
}

public RunExeFile()
{
InitializeComponent();

this.exeName = @"C:\sqlitebrowser_200_b1_win\SQLite Database Browser 2.0 b1.exe";// @"E:\其他资料\金蝶K3 V10.2报表系统用户手册.pdf";

try
{

// Start the process
process = System.Diagnostics.Process.Start(this.exeName);

// Wait for process to be created and enter idle condition
process.WaitForInputIdle();

// Get the main handle
appWin = process.MainWindowHandle;

}

catch (Exception ex)
{
MessageBox.Show(this, ex.Message, "Error");
}

// Put it into this form
SetParent(appWin, this.Handle);

// Remove border and whatnot
// SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
// Move the window to overlay it on this window
MoveWindow(appWin, 0, 0, this.Width-10, this.Height, true);

this.FormClosed += new FormClosedEventHandler(Form_FormClosed);
this.Resize += new EventHandler(Form_Resize);
}
private void Form_FormClosed(object sender, FormClosedEventArgs e)
{
try
{
process.Kill();
}
catch { }
}

private void Form_Resize(object sender, EventArgs e)
{
if (this.appWin != IntPtr.Zero)
{
MoveWindow(appWin, 0, 0, this.Width-10, this.Height, true);
}
//base.OnResize(e);
}

private void ShowPDF_FormClosing(object sender, FormClosingEventArgs e)
{
Graphics gs = this.CreateGraphics();
gs.DrawRectangle(new Pen(new SolidBrush(Color.Black)), new Rectangle(new Point(0, 0), new Size(this.Width, this.Height)));

if (MessageBox.Show("是否关闭!", "information", MessageBoxButtons.OKCancel) == DialogResult.OK)
{

e.Cancel = false;
}
else
{
e.Cancel = true;
this.Enabled = true;
}
}



}
-汪帆- 2011-11-08
  • 打赏
  • 举报
回复
使用平台调用,将.exe窗体嵌入.net窗体
http://blog.csdn.net/bigeyescat/article/details/5966540
Just4life 2011-11-08
  • 打赏
  • 举报
回复
楼主描述问题的能力不是很强

获取启动的进程的句柄(这个得加一个监视的功能了),之后移动窗体并拦截最大化,最小化,标题栏上的操作
gaozqq 2011-11-08
  • 打赏
  • 举报
回复
有那功夫都快开发出一个了!
幸福小6 2011-11-08
  • 打赏
  • 举报
回复
这个监视exe启动的,会不会被当做病毒干掉啊?
LZ野心很大.
congplayer 2011-11-08
  • 打赏
  • 举报
回复
lz野心大了
q198708wyp 2011-11-08
  • 打赏
  • 举报
回复
本人 已经实现了,这个分数看来只能浪费一半了 没有一个答案让我满意,实现的效果,和我问题中描述的一样
hudenq 2011-11-07
  • 打赏
  • 举报
回复
来看热闹的
mm393439135 2011-11-07
  • 打赏
  • 举报
回复
楼上这位朋友 你能给出代码么
z405158579 2011-11-07
  • 打赏
  • 举报
回复
获取桌面酷狗的程序名.exe 然后在winform启动代码里添加获取到桌面的酷狗程序 当你点击你的exe,
酷狗跟随启动,你的exe设置为可拖放大小,让酷狗出现在你的txtbox文本框里
donet菜鸟 2011-11-07
  • 打赏
  • 举报
回复
句柄..
q198708wyp 2011-11-07
  • 打赏
  • 举报
回复
哪位大哥能帮到我 我给他300分
至尊贱客 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 juliohuang 的回复:]
楼主野心很大啊
[/Quote]

楼主想把腾讯的精神发扬光大啊
黄亮 2011-11-07
  • 打赏
  • 举报
回复
楼主野心很大啊
支持海贼王 2011-11-07
  • 打赏
  • 举报
回复
如果你想用的软件,如酷狗,支持插件,那你开发一个插件,用酷狗启动,那样做没问题。如果你直接要这样拿过来不可能的。
Bullatus 2011-11-07
  • 打赏
  • 举报
回复
挡住?那是不是也要处理最小化/最大化/移动呢?
如何被启动的程序不是你的程序,那就有的你忙了
q198708wyp 2011-11-07
  • 打赏
  • 举报
回复
会的支支招啊,会的话,就不来问了啊
tanghuawei 2011-11-07
  • 打赏
  • 举报
回复
呵呵,确实不太清楚这样的实际意义
加载更多回复(5)
PerCDM2013的实现的全部 (2012年2月14日12:57:53 改名为PerCDM2013) 2013年1月27日20:07:48 PerCM2013是我对PerCM系列软件的重写,计划利用1月27日至2月4日这段时间进行设计实现。因为手头还有一个警报发放系统需要完工,所以选择了一直在使用的C#系列进行实现。为了强化前一段时间所做的努力,需要有“项目系统分析”,对技术的选择也要能够大胆有规划。这样,几个软件实现之后,才能够全面地提高能力。 需要研究的技术以下几类 1、现有的代码管理软件的组织构造,自己合理联想; 2、ICSharpCode.TextEditor的重新研究,加速合成; 3、sqlite数据库的使用; 4、自动更新技术的研究; 5、界面库的引入。 立刻行动起来吧! 对陈灯代码管理软件的分析: 这个软件的最大的体会就是“该实现的都已经实现了”。具体以下几点: 1、代码录入模块,可以快捷键进行,其实按照“代码语言”“代码分类”和“关键字”三类就可以区分代码; 2、代码查阅模块,可以查看“最近入库”的和“最近使用”数据,并且数据的查阅方法,非常好。 3、广告,可以一样的方式来打; 4、导入导出代码库其实是一个隐形的亮点,这个系统的数据融合是非常好的;可以加上数据库加密的方法; 5、许多东西都可以设置 包括数据库位置、密码、热键、开机是否启动等等。这里的安全操作密码是为了防止错误删除,可以采用。 2013年1月28日8:36:36 主要界面分为三个部分,一个是数据的获取,一个是数据的查阅(模仿陈灯),此外还包括一个配置界面。采用统一的标准的界面配置,加上一些个人控件的小玩意,保证高效和美观。 2013年1月29日8:12:54 这个程序,玩的就是数据库。在目前时间紧张的情况下,我把零散的时间集合起来,研究一下sqlite. 发现有一个现成的库可以来引用“SQLite ADO .NET”; 2013年1月30日7:35:54 SQLite ADO .NET的引入非常简单,直接把.dll引入,让命名空间来调用就可以了。但是,相比较用的很习惯的sqlserver,这个调试起来还是复杂了一点。 现在编写这种带数据层的代码,已经比较有经验了。 2012年2月2日11:18:37 即使是很简单功能,也可能需要长时间的编写。积累就因此非常的重要。 而且有一点,我一定不要忘记,那就是我现在所编写的代码,都是高层的代码,也就是说,没有杀手锏。但是方法是相同的,总结是相通的,这一点一定要铭记在心。 2012年2月14日12:52:26 这里有一点启示:即使是那些司空见惯的功能,去实现也可能会耗费相当长的时间。这里,对于软件的积累就相当重要了。 我对未来这个PERCDM的规划,从自己的需求开始: 1、要能够完全实现通过分析程灯那个软件得出的东西; 2、稳定大方,特别是代码高亮的那个地方; 3、具备codelibary的那种管理附件的功能; 4、具备局域网管理功能,为未来应有于内网服务。 5、能够有专门的用来写文档的地方,不一定会很完善,但是有开始,软件的名称也改变为 perCDM 不去做的事情:、 1、类似word的这种复杂文档控制; 2、robbing,界面是要简单; 3、高强度的复制。 2012年2月15日8:34:12 对于几个问题的研究: 1、如何实现附件的功能? 现有的系统都是放到数据库中(而不是存放文件路径),这个样子可以保证系统的高度整合。其中使用sqlite的那个系统将文件(可能还有其他的什么东西)放到了一个单独的数据库文件中,是值得借鉴的。 2、CINtanotes的实现可以汲取的地方 这个样式是我一直想实现但是实现不了的。但是确实很重要,可能还是要多问人,合理利用资源; 注意它的那些搜索的小物件,在大体实现的基础上,这些细节就是专业的开始。 数据库设定 有岂止是复杂一点两点。很多东西现在是没有办法理解是为什么的,但是这证明即使是看起来很简单的东西,也可能有复杂的原理,不可小视。 这里还有一个类似的实现了的软件。 需要注意的是,这种全本浏览的方式,也可能是整理的方式,也是我所需要的,就是能够对自己所掌握的知识进行一个系统的整理,这个目前不去实现。 如果简化成为这样一个状态,perCDM不但可以搜索代码,而且可以同时搜索输入的文档(甚至文档就写作在其中),我想可以首先从简单的模式去实现,这是一个我需要的模式。 3、文档模式,对apose进行了初步的分析。这个收费软件想使用起来需要更多的研究; 4、备份,导入导出以及网络热备 热备是备份的升级。首先从本机备份开始来做。 这个需要数据库中有相关设定,时间等,我相信自己能够完成,还有对时钟的控制,这个热备也是需要的; 那么导入导出,就需要使用到GUID,可能还不止一个数据库。 网络热备,我更倾向于建立服务器,基于我比较扎实的网络通行模型,实现这样的一个系统。 2012年2月18日18:59:41 随着编写几个类似程序并且不断总结反思,的确在winform程序编写的能力上有了一定的提高,对于解决问题,开始有了独立的思考。但是必须认识到自己所处于的不利状态,所以集聚所有的资源,去开发一个有用好用的程序非常重要。 测试是非常重要的。测试不仅包括可以使用的测试,也应该包括是否好用的测试和能否达到目的的测试。 在使用和测试之间,如何去取得平衡?我这里需要不断地对代码进行重构,并且做出有足够挑战价值的工作。 经过一段时间的修改,现在代码很糟糕,是到了改对其进行修整的时候了。好看的代码,将是更为宝贵的财富。更何况这里编写的是用于资料统计的工具了? 进行重构的时候,发现自己还是有想法的。的确创新不是无本之源,艰苦的工作是一定创造所需要的。 2012年2月19日20:53:12 今天对于控件的研究上了一个新台阶,回首逐渐实现这个想要的效果的过程,感到很充实。首先是经过多方面的资料搜集,才发现flowpanel可以实现我所需要的效果。然后是基于以前的自定义控件编写基础,写出了能够解决一定问题的控件。然后是不断精益求精,现在在现实效果上面已经差强人意了,缺乏的是效率问题,这个需要继续研究。 现在看来,自定义控件的确是一个解决许多问题的方法,现在能够把click事件都统一的处理起来,程序已经逐渐像样子了。这个记忆比较深刻,应该是忘不掉了,这其实也就教育自己:去追求,才能够有收获。下一步是数据的融合问题。送自己一句话:“不要让这个世界的复杂性阻碍你前进,要成为一个行动主义者”。需要做的实在是太多了,立刻行动吧。 2012年2月26日21:55:32 上个周末回了次盱眙,这几天工作冲突太大,而且手头出现了一个复杂的webapp,现在不是很在状态。但是设计需要继续做下去,只有顶住了,坚持住了,才可能会获得进步。 现在需要解决的是热备问题。热备两个思路,一个是直接把.db拷贝过去,一个是在数据库中设定“dirty”位,定时对所有”dirty”进行处理。两者相比,前者低效但是易行后则较难实现一点。通过一定的实验,发现数据库使用过程中,.db是可以被拷贝的,而且速度不慢。所以首先采用第一种思路。 这里就需要写percmserver,白手起家,如何开始?还是需要循序渐进,首先从最简单的开始。后期,可以将这个服务器设计成多用户的(那就是另一个话题),首先需要把网络的机制引入进来,并发现和解决问题。由于是局域网内文件传输,所以先采用udp的方式(如果我采用第二种方法,可以配套采用tcp的方式)。那么问题分解如下: 1、局域网udp传输文件; 2、加入一些东西,判断当前数据库是否需要被热备(一般来说是时间) 3、如何从服务器将被热备的数据库拷贝回来(比如我换一个机器); 2012年2月29日8:02:30 现在基本把“热备”的机制加入了进去,但是由于对热备的机制认识不是很全面,所以可能没有完全实现这个功能。我认为现在是需要把这个程序拿出来,给更多的人使用,进行发现问题的时候了。 2013年3月24日 10:29:36 利用休假的最后时间把这个软件在网络上发布。想获得许多人的认同是困难的,但是至少这里有一个开始: 代码收录界面: 代码搜索界面,使用了较多的自定义控件: 丰富的配置界面: 具备热备功能: 好了,就是这些。我希望这个软件能够给大家的日常工作或者学习带来方便。需要代码或者有问题讨论,请邮jsxyhelu@gmail.com,一定给出满意答复! Jsxyhelu 二〇一三年三月二十四日 10:41:21

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧