C# winfrom 调用 win32 api GetWindowText 取不到值
DLL定义以下DllImport("user32.dll",EntryPoint="GetWindowTextA",CharSet=CharSet.Ansi,Callin...
DLL定义以下
DllImport("user32.dll", EntryPoint = "GetWindowTextA", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
程序调用代码如下
int retrunHandle = 148713;
StringBuilder tmpSb = new StringBuilder(255);
WinApi.GetWindowText(retrunHandle, tmpSb, tmpSb.Length);
结果取到的 tmpSb 是 "" 空字符串 但是用工具取到就是有的 请问那里写错了呢? 展开
DllImport("user32.dll", EntryPoint = "GetWindowTextA", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
程序调用代码如下
int retrunHandle = 148713;
StringBuilder tmpSb = new StringBuilder(255);
WinApi.GetWindowText(retrunHandle, tmpSb, tmpSb.Length);
结果取到的 tmpSb 是 "" 空字符串 但是用工具取到就是有的 请问那里写错了呢? 展开
3个回答
展开全部
int retrunHandle = 148713;
你不应该把句柄写死,句柄每次运行程序后,都是会改变的。
所以,你先findwindow获取句柄
[DllImport("coredll.dll", EntryPoint = "FindWindow")]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
然后,再去GetWindowText
IntPtr retrunIntPtrHandle = FindWindow("类名","窗体标题栏名");
更多追问追答
追问
都认为句柄错了? 很遗憾的告诉大家 句柄是没有错的 我是为了测试 特意写个句柄上去 源程序 是用 FindWindowEx 找到句柄的 而我的这个句柄 是正确的 取出来的 切切实实存在的
追答
那你要早说啊。不然,单看你的代码,都把句柄写死了,有什么用。
最简单的方法,把你的程序启动起来,用SPY+抓取句柄!
然后,再用你已经写的FindWindowEx方法获取的句柄,来进行对比!
就能看出问题来了。
展开全部
是不是句柄搞错了?程序重启后会重新生成句柄的
更多追问追答
追问
都认为句柄错了? 很遗憾的告诉大家 句柄是没有错的 我是为了测试 特意写个句柄上去 源程序 是用 FindWindowEx 找到句柄的 而我的这个句柄 是正确的 取出来的 切切实实存在的
追答
不应该吧,你把你的工程文件发上来看下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-09-08
展开全部
句柄是会变的,你只定向到148713,因此你需要一个PtrInt类保存“会变化”的句柄。这样你就需要FindWindow了,因为程序每次启动都不可能会总把一个Window放在148713那么准确吧,所以要临时计算。
更多追问追答
追问
都认为句柄错了? 很遗憾的告诉大家 句柄是没有错的 我是为了测试 特意写个句柄上去 源程序 是用 FindWindowEx 找到句柄的 而我的这个句柄 是正确的 取出来的 切切实实存在的
追答
那么你应该将FindWindowEx的代码给贴出来,说不定FindWindowEx的错,找到的句柄不是TextBox或者Window这类的(即没有找到含有文本的窗口)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询