FindWindow始终返回0

josxhn 2012-10-29 07:38:58
代码如下,我建立了一个test.txt文档并打开,然后运行程序,控制台始终返回0,,,,,Google Baidu找了半天都没有解决。

我的系统是win7,IDE是 MonoDevelop


using System;
using System.Runtime.InteropServices;

namespace SendMsgToWindow
{
class MainClass
{
//[DllImport("USER32.DLL")]
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow (string lpClassName, string lpWindowName);

//静态方法必须在静态方法中调用?
private static void MyFindWindow (string wndName)
{
IntPtr ip = FindWindow (null, wndName);
Console.WriteLine(ip.ToString());
if (ip != IntPtr.Zero) {
//找到句柄后,你就可以做你想做的事了,发送信息你可以用SendKeys;
Console.WriteLine ("yes");
}
}

public static void Main (string[] args)
{
MyFindWindow ("test.txt - 记事本");//
}
}
}

...全文
1492 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Regean 2013-07-18
  • 打赏
  • 举报
回复
12楼正解,VS2010在WIN7下使用FindWindowA获取不到句柄,但是使用FindWindowW可以获取到
josxhn 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

有两个版本的,分别为FindWindowA和FindWindowW,你的窗口标题中包含中文。试一试下面的声明:

[DllImport("User32.dll", EntryPoint="FindWindowA")]
[/Quote]

谢谢!我试试看!
josxhn 2012-10-30
  • 打赏
  • 举报
回复
真的是太奇怪了,
参数设置成 "Notepad", "test.txt - 记事本" 就无法取得句柄
但是设置成 "Notepad", null 就可以正确取到
而这些参数都是Spy++捕获的
和解啊和解?
Jia_H 2012-10-30
  • 打赏
  • 举报
回复
有两个版本的,分别为FindWindowA和FindWindowW,你的窗口标题中包含中文。试一试下面的声明:

[DllImport("User32.dll", EntryPoint="FindWindowA")]
josxhn 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
你试一下只设置类名,或者只设置窗口名,或2个都设置看。
或者换换其他窗口试一试看呢。有时候和系统关系,出一些奇怪的问题。
[/Quote]

非常感谢!当只设置类名Notepad的时候就得到了正确的句柄。
虽然距离理想解决方案还有一定距离,不过确实能够解决眼下的问题。
Hauk 2012-10-29
  • 打赏
  • 举报
回复


你试一下只设置类名,或者只设置窗口名,或2个都设置看。
或者换换其他窗口试一试看呢。有时候和系统关系,出一些奇怪的问题。
josxhn 2012-10-29
  • 打赏
  • 举报
回复
我想肯定是可以获取到窗体句柄的,否则Spy++ 是如何做到的呢

PS:我用的不是VS自带的SPY++,是款叫做Spy++ Lite V2.4的小软件
josxhn 2012-10-29
  • 打赏
  • 举报
回复
MyFindWindow ("Notepad", "test.txt - 记事本");


按照spy++设置的参数,FindWindow还是返回0
josxhn 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

用SPY+确定标题对不对
[/Quote]

确定过了,是对的
SocketUpEx 2012-10-29
  • 打赏
  • 举报
回复
用SPY+确定标题对不对
josxhn 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

在VISTA/WIN 7下 FindWindow或FindWindowEX无法获取到窗体句柄
http://www.cnblogs.com/wuhenke/archive/2010/06/20/1761534.html
[/Quote]

谢谢如梦给出的资料,仔细学习了一下,核心意思是这一段:

“理论上原因大意为:在VISTA之前的操作系统中(如XP/ WIN SERVER 2003等),所有的服务线程和应用程序都在Session 0里运行,这种方式具有安全风险,Vista/win7之后的操作系统隔离了服务和应用程序,这样服务就可以免于潜在的来自这应用程序代码的攻击。
我理解时,在WIN 7里当不创建窗体的程序进程,会被认为是服务,从而运行于Session 0里。所以,应用程序调用FindWindow方法也就无法获取进程的窗体句柄啦。”

而我所要获取的目标确实是有窗体的进程,所以还是没能解决~

Jia_H 2012-10-29
  • 打赏
  • 举报
回复
你给的参数不对,最安全的方式是用Visual Studio带的工具spy++找到你所需要的Window,看看对应的class和name是什么,对应更改你的调用代码就可以了。

静态方法无需在静态方法中调用,其他方法也可以的。
wuyq11 2012-10-29
  • 打赏
  • 举报
回复
在VISTA/WIN 7下 FindWindow或FindWindowEX无法获取到窗体句柄
http://www.cnblogs.com/wuhenke/archive/2010/06/20/1761534.html

111,098

社区成员

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

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

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