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 是 "" 空字符串 但是用工具取到就是有的 请问那里写错了呢?
展开
 我来答
FabKiller
2013-09-08 · TA获得超过586个赞
知道小有建树答主
回答量:676
采纳率:0%
帮助的人:484万
展开全部

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方法获取的句柄,来进行对比!
就能看出问题来了。
h598937749
2013-09-08 · TA获得超过316个赞
知道小有建树答主
回答量:1073
采纳率:50%
帮助的人:657万
展开全部
是不是句柄搞错了?程序重启后会重新生成句柄的
更多追问追答
追问
都认为句柄错了? 很遗憾的告诉大家 句柄是没有错的 我是为了测试 特意写个句柄上去  源程序 是用 FindWindowEx 找到句柄的 而我的这个句柄 是正确的 取出来的 切切实实存在的
追答
不应该吧,你把你的工程文件发上来看下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-08
展开全部
句柄是会变的,你只定向到148713,因此你需要一个PtrInt类保存“会变化”的句柄。这样你就需要FindWindow了,因为程序每次启动都不可能会总把一个Window放在148713那么准确吧,所以要临时计算。
更多追问追答
追问
都认为句柄错了? 很遗憾的告诉大家 句柄是没有错的 我是为了测试 特意写个句柄上去  源程序 是用 FindWindowEx 找到句柄的 而我的这个句柄 是正确的 取出来的 切切实实存在的
追答
那么你应该将FindWindowEx的代码给贴出来,说不定FindWindowEx的错,找到的句柄不是TextBox或者Window这类的(即没有找到含有文本的窗口)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式