获得不到窗口的句柄 请高手帮忙

qq_33407554 2016-04-27 02:42:51
StringBuilder title = new StringBuilder(Param.TITLE_LENGTH);
const int WM_GETTEXT = 0x000D;
SendMessage(_hWnd, WM_GETTEXT, Param.TITLE_LENGTH, title);

GetWindowText(_hWnd, title, title.Length)
不管用哪一种方式获得的窗口标题都是{}

c#调用API将带有密码的PPT文件打开 想获取弹出的输入密码窗口的标题
代码应该是没有问题 可就是输出不出来 窗口的标题
是不是进程不对呢 有没有人帮我解答一下 万分感谢!
刚才发错板块了 再发一次

我想知道如何判断当前得到的_hWnd是不是PPT窗口的进程呢
...全文
595 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33407554 2016-06-03
  • 打赏
  • 举报
回复
引用 26 楼 mjp1234airen4385 的回复:
[quote=引用 25 楼 qq_33407554 的回复:] [quote=引用 23 楼 mjp1234airen4385 的回复:] 这是我之前写的一个资源,你参考下。 http://download.csdn.net/detail/mjp1234airen4385/1550580 我自己弄了一个pptx加密后,用这个资源可以找到按钮,并且发送单击事件,成功打开ppt文档
我下载了以后打开怎么看不见代码呢 不是c#吗[/quote] 这是C++的,只是提供例子,你先试试能不能读取到按钮的句柄,发送单击事件。[/quote] 这个问题又到了终极阶段了 就是说代码没有问题 在office2010的情况下 就是好用的 但是在office2013的情况下就不好用 这种时候应该怎么办呢
mjp1234airen4385 2016-06-01
  • 打赏
  • 举报
回复
引用 25 楼 qq_33407554 的回复:
[quote=引用 23 楼 mjp1234airen4385 的回复:] 这是我之前写的一个资源,你参考下。 http://download.csdn.net/detail/mjp1234airen4385/1550580 我自己弄了一个pptx加密后,用这个资源可以找到按钮,并且发送单击事件,成功打开ppt文档
我下载了以后打开怎么看不见代码呢 不是c#吗[/quote] 这是C++的,只是提供例子,你先试试能不能读取到按钮的句柄,发送单击事件。
qq_33407554 2016-05-31
  • 打赏
  • 举报
回复
引用 23 楼 mjp1234airen4385 的回复:
这是我之前写的一个资源,你参考下。 http://download.csdn.net/detail/mjp1234airen4385/1550580 我自己弄了一个pptx加密后,用这个资源可以找到按钮,并且发送单击事件,成功打开ppt文档
我下载了以后打开怎么看不见代码呢 不是c#吗
mjp1234airen4385 2016-05-30
  • 打赏
  • 举报
回复
这是我之前写的一个资源,你参考下。 http://download.csdn.net/detail/mjp1234airen4385/1550580 我自己弄了一个pptx加密后,用这个资源可以找到按钮,并且发送单击事件,成功打开ppt文档
qq_33407554 2016-05-30
  • 打赏
  • 举报
回复
引用 23 楼 mjp1234airen4385 的回复:
这是我之前写的一个资源,你参考下。 http://download.csdn.net/detail/mjp1234airen4385/1550580 我自己弄了一个pptx加密后,用这个资源可以找到按钮,并且发送单击事件,成功打开ppt文档
怎么还要积分啊 我没有积分啊 SendMessage(childhandle, BM_CLICK, (IntPtr)0, "読み取り専用(&R)"); 现在用这个实现按钮点击就是不好用 按钮句柄没找到 窗口的句柄已经获得了 就是点击按钮的操作不好用啊 最后一步了折磨我好几天了 拜托了
qq_33407554 2016-05-19
  • 打赏
  • 举报
回复
引用 21 楼 mjp1234airen4385 的回复:
这不是代码似乎没什么问题,你要确定软件上确实是个按钮,也许是别的东西做成按钮的形状了。
是按钮 我现在猜测是不是不叫Button 这个是打开ppt时弹出输入密码的对话框是 自动点击按钮的操作 现在找不到这个按钮
mjp1234airen4385 2016-05-19
  • 打赏
  • 举报
回复
这不是代码似乎没什么问题,你要确定软件上确实是个按钮,也许是别的东西做成按钮的形状了。
mjp1234airen4385 2016-05-18
  • 打赏
  • 举报
回复
引用 18 楼 qq_33407554 的回复:
[quote=引用 17 楼 mjp1234airen4385 的回复:] 枚举进程里的窗口,再枚举窗口里的控件。 你现在是枚举你要不到窗口,还是枚举不到你要的控件
枚举不到我要的窗口 是因为得到的进程不对 很奇怪[/quote] 你进程如果不对,那枚举不到你要的窗口正常,枚举到了才不正常。 先找找对进程吧,你可以使用spy,或者参考一些安全防护软件, 看看他们枚举到你要的进程后,进程都有什么特征,你也可以枚举所有的进程,然后读取进程里的属性,你要的进程。 再进一步枚举窗口。 有一些软件,安全防护做的比较好,得不到窗口句柄。
qq_33407554 2016-05-18
  • 打赏
  • 举报
回复
引用 19 楼 mjp1234airen4385 的回复:
[quote=引用 18 楼 qq_33407554 的回复:] [quote=引用 17 楼 mjp1234airen4385 的回复:] 枚举进程里的窗口,再枚举窗口里的控件。 你现在是枚举你要不到窗口,还是枚举不到你要的控件
枚举不到我要的窗口 是因为得到的进程不对 很奇怪[/quote] 你进程如果不对,那枚举不到你要的窗口正常,枚举到了才不正常。 先找找对进程吧,你可以使用spy,或者参考一些安全防护软件, 看看他们枚举到你要的进程后,进程都有什么特征,你也可以枚举所有的进程,然后读取进程里的属性,你要的进程。 再进一步枚举窗口。 有一些软件,安全防护做的比较好,得不到窗口句柄。[/quote] 这次得到了窗口句柄 但是得不到上面的按钮是怎么回事呢 给你贴代码 帮我看一下 if (CheckPasswordFormPpt(_hWnd)) { for (j = 0; j < Param.GET_BUTTON_NUM; j++) { IntPtr hWndReadOnlyButton = FindWindowEx(_hWnd, IntPtr.Zero, "Button", Param.POWERPOINT_READONLY); if (hWndReadOnlyButton != IntPtr.Zero) { //パスワードフォームで"読み取り専用"ボタンがあったら無条件で押す PostMessage(_hWnd, WM_COMMAND, GetDlgCtrlID(hWndReadOnlyButton), 0); break; } else { //上記以外は、無条件でOKを押す //パスワード入力フォームを閉じる IntPtr hWndOKButton = FindWindowEx(_hWnd, IntPtr.Zero, "Button", "OK"); if (hWndOKButton != IntPtr.Zero) { PostMessage(_hWnd, WM_COMMAND, GetDlgCtrlID(hWndOKButton), 0); break; } } System.Threading.Thread.Sleep(Param.GET_BUTTON_SLEEP); } } return true; }
qq_33407554 2016-05-16
  • 打赏
  • 举报
回复
引用 17 楼 mjp1234airen4385 的回复:
枚举进程里的窗口,再枚举窗口里的控件。 你现在是枚举你要不到窗口,还是枚举不到你要的控件
枚举不到我要的窗口 是因为得到的进程不对 很奇怪
mjp1234airen4385 2016-05-13
  • 打赏
  • 举报
回复
枚举进程里的窗口,再枚举窗口里的控件。 你现在是枚举你要不到窗口,还是枚举不到你要的控件
qq_33407554 2016-05-12
  • 打赏
  • 举报
回复
如何
引用 14 楼 funxu 的回复:
你自己要获取的窗体所属哪个进程怎么会不知道?难道是随机查找程序主窗体截取标题么? 如果是固定程序的窗口你下个spy++,用它查找窗体就知道了
private void CheckPasswordPpt(object data) { EnumWindowsProc ewp = new EnumWindowsProc(EnterPasswordPpt); while (getCheckPasswordFlag()) { //Enumerate all opening windows EnumWindows(ewp, (String)data); //Sleep for a time System.Threading.Thread.Sleep(Param.SLEEP_TIME); } } 他是这样获得进程的 而且这个进程不对 很奇怪 应该怎么改呢
qq_33407554 2016-05-10
  • 打赏
  • 举报
回复
引用 14 楼 funxu 的回复:
你自己要获取的窗体所属哪个进程怎么会不知道?难道是随机查找程序主窗体截取标题么? 如果是固定程序的窗口你下个spy++,用它查找窗体就知道了
他这个就是用的EnumWindows遍历所有的进程 输出的 _hWnd是数字 随时改变的我根本就找不到 我想要的进程啊 而且无论如何我都获取不到我要的窗口句柄 真是醉了
funxu 2016-05-10
  • 打赏
  • 举报
回复
你自己要获取的窗体所属哪个进程怎么会不知道?难道是随机查找程序主窗体截取标题么? 如果是固定程序的窗口你下个spy++,用它查找窗体就知道了
qq_33407554 2016-05-09
  • 打赏
  • 举报
回复
引用 8 楼 mjp1234airen4385 的回复:
这种一般都是句柄不正确导致的。
现在发现它获取的进程不正确啊 怎么办呢 我之前设置的是遍历所有的进程 获取我要的进程的句柄 也就是说 这个IntPtr _hWnd不对
sinat_34872975 2016-05-09
  • 打赏
  • 举报
回复
谢谢分享 我在这里学习过了
qq_33407554 2016-05-09
  • 打赏
  • 举报
回复
引用 11 楼 funxu 的回复:
[DllImport("user32", CharSet = CharSet.Auto)] private static extern int GetWindowThreadProcessId(IntPtr hwnd,out int ProcessId); 刚才这里写错了 Process p = Process.GetProcessById(ProcessId);
这个程序写好了让我改一个BUG 一直都没改出来 我不知道怎么用processname来判断是否是我要的 窗口的processname是什么我不知道啊 就是获取不到窗口标题 求助
funxu 2016-05-09
  • 打赏
  • 举报
回复
[DllImport("user32", CharSet = CharSet.Auto)] private static extern int GetWindowThreadProcessId(IntPtr hwnd,out int ProcessId); 刚才这里写错了 Process p = Process.GetProcessById(ProcessId);
funxu 2016-05-09
  • 打赏
  • 举报
回复
参看 http://blog.csdn.net/dengta_snowwhite/article/details/6067928 1 EnumWindows找到所有进程顶层窗体 2 GetWindowThreadProcessId(hWnd,out ProcessId);用窗体句柄找到所在进程id 3 Process p = Process.GetProcessById(lpdwProcessId);获取进程信息 p.ProcessName用名称判断是否是你需要的进程 具体怎么声明百度下都有,亲测可用
mjp1234airen4385 2016-04-28
  • 打赏
  • 举报
回复
这种一般都是句柄不正确导致的。
加载更多回复(7)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧