精华内容
下载资源
问答
  • **在主窗口中打开一个带有计算器功能子窗口,有三种实现方法。 1.原始方法,在工程中除主窗体Form1外创建一个子窗体CalcForm,并在子窗体里添加计算器功能。 2.在窗体中添加计算器功能,然后将其生成一个...

    **在主窗口中打开一个带有计算器功能的子窗口,有三种实现方法。
    这里写图片描述
    1.原始方法,在工程中除主窗体Form1外创建一个子窗体CalcForm,并在子窗体里添加计算器功能。
    这里写图片描述
    2.在窗体中添加计算器功能,然后将其生成一个窗体库dll,主窗体Form1通过调用该窗体库打开计算器。
    这里写图片描述
    这里写图片描述
    3.将计算器功能做成一个控件库dll,在主窗体Form1外创建一个子窗体CalcForm,将该dll作为一个控件添加到该子窗体中。
    这里写图片描述
    这里写图片描述**

    展开全文
  •  钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置程以监视指定窗口某种消息,而且所监视窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用...

    这次想写一篇,自己曾经做过的一个Hook程序,温故而知新。

    作为一个C++程序员,肯定对钩子(Hook)技术有所了解:消息钩子,API钩子。

    基本概念:

        钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

        钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

    对于标题所描述的拦截带有某些关键字窗体,基本思路是:我们需要创建一个全局钩子,然后捕获到窗体显示消息,捕获到后利用Windows消息机制,抛出去到外层获取窗口标题,当匹配关键字时,给对应窗口发送关闭消息。

    对于创建全局钩子,我们需要采用DLL注入的方式,Hook的DLL工程主代码如下:

    #include <Windows.h>
    
    #pragma data_seg("HookWnd")
    HHOOK	  g_HookWnd		 = NULL;	//钩子句柄
    HWND      g_DestWnd		 = NULL;	//目的窗口句柄,就是截获的消息要发往什么窗口
    HINSTANCE g_hInst		 = NULL;
    #pragma data_seg()
    
    #pragma comment( linker, "/section:HookWnd,RWS" )
    
    __declspec(dllexport) BOOL SetHook(HWND hWnd);
    __declspec(dllexport) void DestroyHook();
    
    #define WM_MYMESSAGE (WM_USER + 1)
    
    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
    {
    	g_hInst = hinstDll;//保存应用程序实例
    	return TRUE;
    }
    
    
    LRESULT CALLBACK MyWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	CWPSTRUCT *pCwp = reinterpret_cast<CWPSTRUCT*>(lParam);
    	if (pCwp->message == WM_SHOWWINDOW)
    	{
    		::SendMessage(g_DestWnd, WM_MYMESSAGE, wParam, reinterpret_cast<LPARAM>(pCwp->hwnd));
    		return 0;
    	}
    	else
    		return CallNextHookEx(g_HookWnd, nCode, wParam, lParam);
    }
    
    BOOL SetHook(HWND hWnd)
    {
    	if (NULL == hWnd)
    		return FALSE;
    	
    	g_DestWnd = hWnd;
    
    	//第三个参数还可通过些方法获得:GetModuleHandle("HookTest.dll")
    	return (NULL != (g_HookWnd = ::SetWindowsHookEx(WH_CALLWNDPROC, MyWndProc, g_hInst, 0)));
    }
    
    void DestroyHook()
    {
    	if (NULL != g_HookWnd) 
    	{
    		UnhookWindowsHookEx(g_HookWnd);
    		g_DestWnd = NULL;
    	}
    }

    SetWindowsHookEx(WH_CALLWNDPROC, MyWndProc, g_hInst, 0));最后一个参数0,代表创建的是全局钩子。

     

     

     

    WH_CALLWNDPROC装载的是:窗口钩子,当系统向目标窗口发送消息时将触发此钩子 进入到MyWndProc回调函数处理;

     当回调函数里面捕获到:WM_SHOWWINDOW消息,发送消息到外层处理;

    外层消息处理函数为:

    LRESULT CHookTestDlg::OnMyMessage( WPARAM wParam, LPARAM lParam )
    {
    	HWND hwnd = reinterpret_cast<HWND>(lParam);
    	UINT nTitleLen = ::GetWindowTextLength(hwnd);
    	TCHAR *pStr = new TCHAR[nTitleLen + 1]();
    	ZeroMemory(pStr, nTitleLen + 1);
    	::GetWindowText(hwnd, pStr, nTitleLen + 1);
    	CString str(pStr);
    	delete []pStr;
    
    	if (str.Find(m_str) != -1)	//CString查找字符串未找到返回-1
    	{
    		::SendMessage(hwnd, WM_CLOSE, NULL, NULL);
    		return 1;
    	}
    
    	return 0;
    }

    获取对应窗口句柄的窗口标题,和设置的关键字匹配,当满足条件则发送关闭消息;

     

     

     

    外层调用Hook的DLL函数实例:

    HINSTANCE hIst = NULL;
    // 创建全局钩子,监控所有进程
    void CHookTestDlg::OnCreateDllHook() 
    {
    	m_edit.GetWindowText(m_str);
    	m_edit.EnableWindow(FALSE);
    	hIst = ::LoadLibrary("..\\HookTest\\HookDll.dll"); // 加载dll
    	if (NULL != hIst)
    	{
    		typedef BOOL (*pFunSetHook)(HWND);
    		pFunSetHook pSetHook = (pFunSetHook)GetProcAddress(hIst, "SetHook");
    		if (NULL != pSetHook)
    		{
    			if(pSetHook(m_hWnd))
    				AfxMessageBox("创建全局钩子成功...");
    		}
    	}
    }
    
    //卸载全局钩子
    void CHookTestDlg::OnDestroyDllHook() 
    {
    	if (NULL != hIst)
    	{
    		typedef void (*pFunDestroyHook)();
    		pFunDestroyHook pDestryHook = (pFunDestroyHook)GetProcAddress(hIst, "DestroyHook");
    		if (NULL != pDestryHook)
    		{
    			pDestryHook();
    			::FreeLibrary(hIst);
    			hIst = NULL;
    			AfxMessageBox("销毁全局钩子成功!");
    		}
    	}
    	m_edit.EnableWindow(TRUE);
    }
    

     

     

     

     

     

    .........

    至此,一个简单的拦截窗口程序,已经实现。

     

     

    展开全文
  • //实例化一个DirectoryInfo对象 foreach (FileSystemInfo f in dinfo.GetDirectories())//获取目录 { if (f is DirectoryInfo)//如果是文件夹 { MessageBox.Show(f.Name);//显示目录名称 } } ...
  • access窗体简介

    千次阅读 2014-03-20 19:40:48
    例如,可以创建一个带有子窗体的主窗体,用于显示“类别”表和“产品”表中的数据。“类别”表中的数据是一对多关系中的“一”方,“产品”表中的数据是关系中的“多”方,因为每一类别都可以有多个产品。

    子窗体是插入到另一窗体中的窗体。原始窗体称为主窗体,窗体中的窗体称为子窗体。窗体/子窗体也称为阶层式窗体、主窗体/细节窗体或父窗体/子窗体。

    当显示具有一对多关系的表或查询中的数据时,子窗体特别有效。例如,可以创建一个带有子窗体的主窗体,用于显示“类别”表和“产品”表中的数据。“类别”表中的数据是一对多关系中的“一”方,“产品”表中的数据是关系中的“多”方,因为每一类别都可以有多个产品。

    带有子窗体的主窗体

    标注 1 主窗体显示关系中“一”方的数据。

    标注 2 子窗体显示关系中“多”方的数据。

    在这类窗体中,主窗体和子窗体彼此链接,所以子窗体只显示与主窗体中当前记录相关的记录。例如,当主窗体显示“饮料”类别时,子窗体将会只显示“饮料”类别中的产品。

    隐藏在窗体中显示子窗体

    当创建子窗体时,可以将其设计为显示在“数据表”视图、“窗体”视图、数据透视表视图或数据透视图视图中。也可以设置子窗体的默认视图,禁用一个或多个视图。当主窗体在“窗体”视图中显示时,可以切换子窗体的视图。

    当主窗体在数据透视表视图或数据透视图视图中打开时,子窗体不显示。

    隐藏“数据表”视图中显示的子窗体

    显示为数据表的子窗体

    隐藏在“窗体”视图中显示为简单连续窗体的子窗体

    显示为简单连续窗体的子窗体

    隐藏在“窗体”视图中显示为连续窗体的子窗体 

    显示为数据表样式的连续窗体的子窗体

    可以使窗体显示在看似数据表的“窗体”视图中,但由于它显示在“窗体”视图中,因此可以显示窗体页眉和页脚。

    隐藏数据透视表视图中显示的子窗体

    数据透视表视图中的子窗体

    隐藏数据透视图视图中显示的子窗体

    数据透视图视图中的子窗体

    隐藏将窗体与子窗体同步

    根据具有一对多关系的表来创建窗体和子窗体时,主窗体显示一对多关系中的“一”方,子窗体显示一对多关系中的“多”方。主窗体与子窗体保持同步,因此子窗体只显示与主窗体中记录相关的记录。

    如果是使用向导创建子窗体,或者如果是从“数据库”窗口中将窗体、表或查询拖动到另一个窗体来创建子窗体,则在满足下列两项条件之一时,Microsoft Access 会自动使主窗体和子窗体同步:

    • 已为选定的表定义了关系,或已为作为查询基础的表定义了关系。
    • 主窗体基于带主键的表,而子窗体基于的表又包含与主键同名、且数据类型和字段长度相同或兼容的字段。例如,在 Microsoft Access 数据库中,如果主窗体的基础表的主键为“自动编号”字段,且其“字段大小”属性设为“长整型”,则子窗体的基础表中相应的字段应该是“字段大小”属性设为“长整型”的“数字”字段。如果选定的是查询(一个或多个),则查询的基础表必须符合这些条件。

    隐藏嵌套级别

    如果将每个子窗体都放在主窗体上,则主窗体可以包含任意数量的子窗体。还可以嵌套多达七层的子窗体。也就是说,可以在主窗体内包含子窗体,而子窗体内可以再有子窗体,等等。例如,可以用一个主窗体来显示客户数据,用一个子窗体来显示订单,用另一个子窗体来显示订单的详细内容。但在数据透视表视图或数据透视图视图中窗体不显示子窗体。

    隐藏用窗体和子窗体输入数据

    当用带有子窗体的主窗体输入新记录时,在子窗体中输入数据后,Microsoft Access 会保存主窗体中的当前记录。这可以保证在“多”方表中的所有记录在“一”方表中都有相关的记录。当在子窗体中添加记录时,Microsoft Access 也会自动保存每一条记录。

    展开全文
  • 本文来自Torres.Wu发表在博客园博客,转载请标明...首先还是创建一个form程序,在form2窗体中添加一个ReporView控件,load方法如下: private void Form2_Load(object sender, EventArgs e) { DataSet ds3...

    本文来自Torres.Wu发表在博客园的博客,转载请标明出处。

    同上一篇差不多,这次咱们加载带有子报表的RDCl文件。首先还是创建一个form程序,在form2窗体中添加一个ReporView控件,load方法如下:

    private void Form2_Load(object sender, EventArgs e)
            {
                DataSet ds3 = new DataSet();
                string fileName = System.Configuration.ConfigurationManager.AppSettings["file3"].ToString();
                string rptFilePath = System.IO.Path.Combine(Application.StartupPath, fileName);
                this.reportViewer1.LocalReport.ReportPath = rptFilePath;
    
                this.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;
                try
                {
                    ds3 = getDS3();
                }
                catch (Exception ex)
                {
    
                    MessageBox.Show(ex.Message);
                }
                Microsoft.Reporting.WinForms.ReportDataSource r3 = new Microsoft.Reporting.WinForms.ReportDataSource();
                r3.Value = ds3.Tables[0];
                r3.Name = "DataSet1";
                this.reportViewer1.LocalReport.DataSources.Add(r3);
                //添加加载子报表事件
                this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubreportProcessingEventHandler);
                this.reportViewer1.RefreshReport();
            }

    大家看到与上一篇不同的是这次在load事件中加了子报表的加载事件,此事件在处理子报表时发生。

    同样的,要有主报表数据源和子报表数据源:

     //主报表数据源
            DataSet getDS3()
            {
                string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionSQL"].ToString();
                SqlConnection conn = new SqlConnection(connStr);
                //读取sql
                XmlDocument xmldoc = new XmlDocument();
                string fileName = System.Configuration.ConfigurationManager.AppSettings["file3"].ToString();
                string rptFilePath = System.IO.Path.Combine(Application.StartupPath, fileName);
                xmldoc.Load(rptFilePath);
                //this.reportViewer1.LocalReport.ReportPath = rptFilePath;
    
                XmlNodeList sqlM = xmldoc.GetElementsByTagName("CommandText");
                string sql = sqlM[0].InnerXml.ToString();
                XmlNodeList canshu = xmldoc.GetElementsByTagName("QueryParameter");
                //获取数据源
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                List<string> list = new List<string>();
                list.Add("生物科学系");
                //如果有参数 传参数
                if (canshu.Count > 0)
                {
                    XmlNodeList canshuList = xmldoc.GetElementsByTagName("ReportParameter");
                    if (canshuList.Count > 0)
                    {
                        for (int i = 0; i < canshuList.Count; i++)
                        {
    
                            da.SelectCommand.Parameters.Add("@" + canshuList[i].Attributes.GetNamedItem("Name").Value, list[i]);  //参数传给数据源
                            ReportParameter rp = new ReportParameter(canshuList[i].Attributes.GetNamedItem("Name").Value, list[i]);
                            this.reportViewer1.LocalReport.SetParameters(rp);  //参数传给报表
    
                        }
                    }
    
                }
                DataSet de = new DataSet();
                da.Fill(de, "Table");
                conn.Close();
                return de;
            }
            //子报表数据源
            DataSet getDS4()
            {
                string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionSQL"].ToString();
                SqlConnection conn = new SqlConnection(connStr);
                //读取sql
                XmlDocument xmldoc = new XmlDocument();
                string fileName = System.Configuration.ConfigurationManager.AppSettings["file4"].ToString();
                string rptFilePath = System.IO.Path.Combine(Application.StartupPath, fileName);
                xmldoc.Load(rptFilePath);
                XmlNodeList sqlM = xmldoc.GetElementsByTagName("CommandText");
                string sql = sqlM[0].InnerXml.ToString();
                XmlNodeList canshu = xmldoc.GetElementsByTagName("QueryParameter");
                //获取数据源
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                List<string> list = new List<string>();
                list.Add("生物科学系");
                //如果有参数 传参数
                if (canshu.Count > 0)
                {
                    XmlNodeList canshuList = xmldoc.GetElementsByTagName("ReportParameter");
                    if (canshuList.Count > 0)
                    {
                        for (int i = 0; i < canshuList.Count; i++)
                        {
                            da.SelectCommand.Parameters.Add("@" + canshuList[i].Attributes.GetNamedItem("Name").Value, list[i]);  //参数传给数据源
                        }
                    }
                }
                DataSet de = new DataSet();
                da.Fill(de, "Table");
                conn.Close();
                return de;
            }

    还有在处理子报表时发生的事件:

            /// <summary>
            /// 为子报表加数据源
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void SubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
            {
                DataSet ds4 = new DataSet();
                try
                {
                    ds4 = getDS4();
                }
                catch (Exception)
                {
    
                    throw;
                }
                DataTable dt = ds4.Tables[0];
    
                Microsoft.Reporting.WinForms.ReportDataSource r3 = new Microsoft.Reporting.WinForms.ReportDataSource();
                r3.Value = ds4.Tables[0];
                r3.Name = "DataSet1";
                e.DataSources.Add(r3);
            }本文来自Torres.Wu发表在博客园的博客,转载请标明出处。

    这样就大功告成了,配置文件和上一篇一样。

    本文来自Torres.Wu发表在博客园的博客,转载请标明出处。

    转载于:https://www.cnblogs.com/wwfjcy479/p/3700630.html

    展开全文
  • im209.zip 利用该控件创建带图标的菜单(68KB) 33,hlink.zip 将这个控件加到你的窗体上,并设置好URL,当点击该控件时,你就可以打开一个网站或启动默认的电子邮件程序或是其它指定的程序。此外,你还可以...
  • im209.zip 利用该控件创建带图标的菜单(68KB) 33,hlink.zip 将这个控件加到你的窗体上,并设置好URL,当点击该控件时,你就可以打开一个网站或启动默认的电子邮件程序或是其它指定的程序。此外,你还可以...
  • 通过File菜单中Create New Frame命令能够创建一个位于顶层SDI应用,但关闭主应用后其它窗口也将关闭,程序由Visual C++ 5.0开发(30KB)<END><br>32,picknew.zip 演示如何注册多文档模板且避免MFC自动产生...
  • 今天用MDI窗体,在一个子窗体A中,通过主窗体的下拉菜单调用另外一个子窗体B,出现错误“创建窗口句柄时出错”,原因不清楚;似乎与该子窗体A用了DotNetBar控件的DataGridViewX控件有关,我换成C#自带的DataGridView...
  • 为线程创建一个单独类,在类初始化函数里头为类里头变量赋值,来达到传入参数比较简单。下面有些方法是问题,不过我已经达到了目的就懒得去排错了,哪位朋友看出问题了提醒一下啊。呵呵...方法一:在VS...
  • C#线程调用参数方法

    千次阅读 2008-07-12 09:41:00
    转:C#线程调用参数方法--2 2007年06月15日 星期五 下午 11:24 个人认为,还是为线程创建一个单独类,在类初始化函数里头为类里头变量赋值,来达到传入参数比较简单。下面有些方法是问题,不过我已经...
  • 实例129 通过泛型实现子窗体的不同操作 160 实例130 使用泛型去掉数组中的重复数字 161 第6章 数据结构与算法 163 6.1 数据结构的实现 164 实例131 单向链表的实现 164 实例132 双向链表的实现 168 实例133 堆栈的...
  • 【单选题】在创建带子窗体的窗体时,主窗体和子窗体的基表必须肯__关系。【单选题】将表“学生名单 2”的记录复制到表“学生名单1”中,且不删除表“学生名单 1”中的记录,所使用的查询方式是——。【单选题】以下...
  •  实例129 通过泛型实现子窗体的不同操作 160 实例130 使用泛型去掉数组中的重复数字 161 第6章 数据结构与算法 163 6.1 数据结构的实现 164  实例131 单向链表的实现 164  实例132 双向链表的实现 168 ...
  • 5个目标文件,演示Address EJB实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化上下文,用clientgetHome()函数调用Home接口...
  • 5个目标文件,演示Address EJB实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化上下文,用clientgetHome()函数调用Home接口...
  • Lab3Web:Pratikum 3-源码

    2021-04-09 18:20:02
    创建一个窗体,该窗体显示一个下拉菜单和一个具有多个选择列表框。 实习报告 建立清单 在行上创建有序列表 已排序列表已成功添加到浏览器 接下来,通过添加一个正方形来添加“无序”列表 Unorederd列表已...
  • UI布局插件可以创建您想要任何UI外观—从简单标题或边栏,到带有工具栏、菜单、帮助面板、状态栏、子窗体复杂应用程序。 将它与其他jqueryui小部件结合起来创建一个复杂应用程序。没有任何限制或问题-这个...
  • 程序 AntiStrongOD, 逻辑型, 公开, 这效果还行,检测带有驱动 OD调试器 此函数专门对付 StrongOD 插件 .参数 判断OD运行状态, 逻辑型, 可空, 此参数作用: 发现OD驱动时 —是否检测OD运行状态作为返回值基础 ,...
  • 现将我最大的一个程序工程VC++源代码奉献出来,这个软件原准备市场化,但因种种原因并没有成功, 现在全部开源,希望能给你一些帮助和推动更多开源。 作者保留追究将此软件全部或部份源码进行商业化为目的...
  • 案例12 带有背景音乐随机字幕屏幕保护程序 案例13 托盘动画图标程序 本章小结 第4章 Visual C#2006与数据库 案例1 利用DataGridView控件显示数据库信息 案例2 数据库数据记录单 案例3 利用下拉列表框动态查询...
  • 1.2 第一个VB应用程序9 1.2.1 向窗体添加代码9 1.2.2 设置控件属性10 1.2.3 为控件命名12 1.2.4 移动及重新调整控件尺寸13 1.2.5 设置Tab顺序13 1.2.6 添加代码14 1.2.7 运行和调试程序15 1.2.8 优化示例程序16 ...
  • 1.2 第一个VB应用程序9 1.2.1 向窗体添加代码9 1.2.2 设置控件属性10 1.2.3 为控件命名12 1.2.4 移动及重新调整控件尺寸13 1.2.5 设置Tab顺序13 1.2.6 添加代码14 1.2.7 运行和调试程序15 1.2.8 优化示例程序16 ...
  • ◆如何在启动时阻止MDI应用程序创建一个新文档?◆ 33 ◆如何在多文档MFC程序中制作独立File|New菜单?◆ 33 ◆如何检测视是否处于分割状态?◆ 34 ◆如何使程序保持极小状态?◆ 34 ◆如何确定当前进程实例是否为...
  • 10.9.2 单个表中父/视图 10.9.3 使用查找表编辑字段 10.9.4 处理来自数据库图片 10.9.5 探测并发冲突 10.10 总结 第11章 缓存和异步页面 11.1 理解ASP.NET缓存 11.2 输出缓存 11.2.1 声明性...
  • 10.9.2 单个表中父/视图 10.9.3 使用查找表编辑字段 10.9.4 处理来自数据库图片 10.9.5 探测并发冲突 10.10 总结 第11章 缓存和异步页面 11.1 理解ASP.NET缓存 11.2 输出缓存 11.2.1 声明性...
  • 10.4.1 一个简单FLWOR表达式示例 289 10.4.2 深入讨论FLWOR表达式 289 10.4.3 FLWOR表达式和XPath表达式比较 292 10.5 XQuery函数 292 10.5.1 XQuery内置函数 292 10.5.2 XQuery用户定义函数 294 10.6 在...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0136 使用FileCreate函数创建一个图形文件 88 0137 使用GetCurrentDir函数返回当前目录 89 0138 在指定路径中搜索指定文件 89 0139 使用FileExists函数判断指定文件是否存在 90 0140 使用FileGetAttr函数...
  • 实例129 通过泛型实现子窗体的不同操作 实例130 使用泛型去掉数组中的重复数字 第6章 数据结构与算法 6.1 数据结构的实现 实例131 单向链表的实现 实例132 双向链表的实现 实例133 堆栈的实现 实例134 队列...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 223
精华内容 89
关键字:

创建一个带有子窗体的窗体