代码如下,我建立了一个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 - 记事本");//
}
}
}

解决方案 »

  1.   

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

  2.   

    你给的参数不对,最安全的方式是用Visual Studio带的工具spy++找到你所需要的Window,看看对应的class和name是什么,对应更改你的调用代码就可以了。静态方法无需在静态方法中调用,其他方法也可以的。
      

  3.   


    谢谢如梦给出的资料,仔细学习了一下,核心意思是这一段:“理论上原因大意为:在VISTA之前的操作系统中(如XP/ WIN SERVER 2003等),所有的服务线程和应用程序都在Session 0里运行,这种方式具有安全风险,Vista/win7之后的操作系统隔离了服务和应用程序,这样服务就可以免于潜在的来自这应用程序代码的攻击。
    我理解时,在WIN 7里当不创建窗体的程序进程,会被认为是服务,从而运行于Session 0里。所以,应用程序调用FindWindow方法也就无法获取进程的窗体句柄啦。”而我所要获取的目标确实是有窗体的进程,所以还是没能解决~
      

  4.   

    MyFindWindow ("Notepad", "test.txt - 记事本");按照spy++设置的参数,FindWindow还是返回0
      

  5.   

    我想肯定是可以获取到窗体句柄的,否则Spy++ 是如何做到的呢PS:我用的不是VS自带的SPY++,是款叫做Spy++ Lite V2.4的小软件
      

  6.   


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

  7.   

    真的是太奇怪了,
    参数设置成  "Notepad", "test.txt - 记事本"  就无法取得句柄
    但是设置成  "Notepad", null  就可以正确取到
    而这些参数都是Spy++捕获的
    和解啊和解?
      

  8.   

    有两个版本的,分别为FindWindowA和FindWindowW,你的窗口标题中包含中文。试一试下面的声明:[DllImport("User32.dll", EntryPoint="FindWindowA")]
      

  9.   

    12楼正解,VS2010在WIN7下使用FindWindowA获取不到句柄,但是使用FindWindowW可以获取到