代码如下  [DllImport("user32.dll", EntryPoint="SendMessageA")]
  public static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);
  public const int WM_CLOSE = 0x10;  [DllImport("user32.dll", EntryPoint="FindWindowA")]
  public static extern int FindWindow (string lpClassName, string lpWindowName);int hwnd = FindWindow(null,"窗口名");
int a = SendMessage(hwnd, WM_CLOSE, 0, 0);其中hwnd得到了句柄(值不为0),可惜SendMessage返回的值a是0,无法关闭窗体,这是为什么?

解决方案 »

  1.   

    [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint="SendMessageA")]
    public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); private void button8_Click(object sender, System.EventArgs e)
    {
    IntPtr hwnd_win ;    hwnd_win = FindWindow(null,this.txtFindWinCaption.Text);
    SendMessage(hwnd_win,WM_CLOSE,0,0);
    }
      

  2.   

    把int改为IntPtr指针应该可以了
      

  3.   

    to fellowcheng(头都编大了) :
      [DllImport("user32.dll", EntryPoint="FindWindowA")]
      public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  [DllImport("user32.dll", EntryPoint="SendMessageA")]
      public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);   IntPtr hwnd; 
       hwnd = FindWindow(null,"窗口");
      SendMessage(hwnd, WM_CLOSE, 0, 0);为什么还是不可以呢?
      

  4.   

    我问的意思是,关闭外部窗体,比如"我的电脑",而不是程序本身。这样的话 用sendmessage也可以实现么??
      

  5.   

    hwnd = FindWindow(null,"窗口");
    是否找到了进程的主窗体,如果不是有可能被过滤了
      

  6.   

    to zsh_olddog(olddog) :
    可以找到阿 hwnd 的值不为0 ,但是还是不能关闭窗体?实在是不知道为什么?
      

  7.   

    你的代码看上去没有任何问题,在32位系统上也不需要把int改成IntPtr
    不过没必要那样指定EntryPoint,默认就可以了(指定了A/W版本也没用)这里返回值是0表示操作成功,窗体应该已经被关闭了
      

  8.   

    to Sunmast(速马/Maybe I'm Amazed):
    我也觉得没有问题,但是就是不可以 不知道为什么?关闭其他都可以,就是关闭例如“我的电脑”之类的窗口就是不行,郁闷。。对了,我用的是日文的os不知道会不会有影响呢?
      

  9.   

    1、与时俱进,先鄙视一下你的日文系统 :P
    2、用PostMessage:
    [DllImport("user32.dll")]
    static extern int PostMessage(int hWnd,int Msg,int wParam,int lParam);...int hwnd = FindWindow(null,"我的电脑");
    int a = PostMessage(hwnd, WM_CLOSE, 0, 0);