//以上已得到proc
                SetActiveWindow(proc);
                SetForegroundWindow(proc);
                PostMessage(proc, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                //以上朝proc发送WM_CLOSE已成功,回弹出关闭提示对话框                //以下朝关闭提示对话框发送ALT+Y
                IntPtr aa = FindWindow("#32770", "提示信息");
                if (aa != IntPtr.Zero)
                {
                    SetActiveWindow(aa);
                    SetForegroundWindow(aa);                    SendKeys.SendWait("%Y");
                }                以上代码在 ,系统未锁定时,实现,,没有任何问题。
                系统锁定了,就不行了。
                请高手指点。

解决方案 »

  1.   

    当然,锁定后的输入桌面是Winlogon,你的程序的桌面是Default,因此SendKeys.SendWait("%Y");无效
      

  2.   

    有啥可行的解决方法吗?
    我 用desktop, open default,后,还是不行啊
      

  3.   

    当然不行,只要你的线程和要接受按键的线程不在inputdesktop就不能这样
    你可以考虑PostMessage
      

  4.   

    PostMessage  ,不行。
    压根发送不了,用微软网站的例子,一个字符都没做改动,都不行如下using System.Runtime.InteropServices;public const uint WM_SYSKEYDOWN = 260;
    public const uint VK_MENU = 18;//virtual key code of Alt key
    public const uint VK_F= 70;//virtual key code of 'F' key[DllImport("User32.Dll")]
    public static extern long PostMessage(IntPtr hWnd, UInt32 wMsg, long wParam, long lParam);[DllImport("user32.dll")]
    public static extern IntPtr FindWindow(String sClassName, String sAppName);
    IntPtr hwnd=FindWindow("Notepad","Untitled - Notepad");//这里改了,hwnd能够找到的。
    PostMessage(hwnd, WM_SYSKEYDOWN, VK_MENU, 1);
    PostMessage(hwnd, WM_SYSKEYDOWN, VK_F, 1);
      

  5.   

    那是你没发对窗口
    如果你要往记事本里面写字符,PostMessage的窗口不是那个有标题栏的,而是里面的edit控件,找到有标题栏的记事本窗口后,用FindWindowEx找到里面的控件的句柄
      

  6.   

    我程序是这样的:
    带一个定时器的程序 用以  关闭另一个带退出对话进程。系统锁定时,定时器执行时,就 不行了
    必须要等登陆了,定时器里 执行的“朝那个 退出对话框 发送  按键”,才执行请问:
    锁定时,带此定时器的进程就自动 切换到 winlogon ?
    要 被关闭的进程还停留在 Default ?
    还是 2个都在 winlogon 了?哎,我很菜啊折腾了半天,没搞定都最后都搞糊涂了
      

  7.   

    锁定时,输入桌面会变成winlogon,你的那两个线程还在Default,只要有一个不在输入桌面,SendKeys.SendWait("%Y");就不能起到你要的效果
      

  8.   

    但是PostMessage可以用,你先找到那个Y按钮的窗口句柄,然后发一个enter键的WM_KEYDOWN
      

  9.   

    调用PostMessage的线程和被PostMessage的需要在同一桌面,你的状况是符合要求的
      

  10.   

    明白了。
    可惜,  PostMessage  有不行——————————————————————————————            IntPtr aa = FindWindow("#32770", "提示信息");
                Thread.Sleep(100);
                IntPtr hwnd = FindWindowEx(new HandleRef(this, aa), new HandleRef(this, IntPtr.Zero), "Button", "是(&Y)");
                Thread.Sleep(100);
                //PostMessage(hwnd, WM_SYSKEYDOWN, VK_MENU, 1);
                SetActiveWindow(hwnd);
                SetForegroundWindow(hwnd);
                PostMessage(hwnd, WM_SYSKEYDOWN, VK_Y, 1);
                Thread.Sleep(100);
    ——————————————————————————————————以上代码 在 系统未锁定 时 可以。 系统锁定了, 也不行。和 SendKeys.SendWait("%Y")  一样 不起效果  。
      

  11.   

    不要发,你先试一下选中是后按回车行不行,而且你要发WM_KEYDOWN
    或者你用父窗口法干掉那个提示框
      

  12.   

    你检查一下 IntPtr hwnd = FindWindowEx(new HandleRef(this, aa), new HandleRef(this, IntPtr.Zero), "Button", "是(&Y)");是否成功
      

  13.   

    系统 锁定  时 IntPtr hwnd = FindWindowEx(new HandleRef(this, aa), new HandleRef(this, IntPtr.Zero), "Button", "是(&Y)");
                
    成功————————————————
    难道 是 
                SetActiveWindow(hwnd);
                SetForegroundWindow(hwnd);
    这 2句不行???
      

  14.   

    SetActiveWindow(hwnd);
      SetForegroundWindow(hwnd)
    不需要这两个,你发WM_KEYDOWN试一下
      

  15.   

                //IntPtr hwnd = FindWindow("Notepad", null);
                IntPtr aa = FindWindow("#32770", "提示信息");
                Thread.Sleep(100);
                IntPtr hwnd = FindWindowEx(new HandleRef(this, aa), new HandleRef(this, IntPtr.Zero), "Button", "是(&Y)");
                Thread.Sleep(100);
                if (hwnd != IntPtr.Zero)
                {
                    //listBox1.Items.Add(DateTime.Now.ToString()+"  成功");                //PostMessage(hwnd, WM_SYSKEYDOWN, VK_MENU, 1);
                    //SetActiveWindow(hwnd);
                    //SetForegroundWindow(hwnd);
                    PostMessage(hwnd, WM_KEYDOWN, VK_Y, 1);
                    Thread.Sleep(100);
                }
     ——————————————————————————————————————
     还是没成功。 未锁定,可以,锁定了,无效果。
      

  16.   

    没有,只是 锁定ctrl+alt+del
    锁定计算机(k)
      

  17.   

    改为 如下:
                    PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0);
                    PostMessage(hwnd, WM_KEYUP, VK_RETURN, 0);
                    Thread.Sleep(100);
    ————————————————————————
    成功了。
    太感谢您的指导了
      

  18.   

    PostMessage(hwnd, BM_CLICK, 0, 0);
    好像也可以。。
      

  19.   

    这个当然可以,你向按钮发WM_LBUTTONDOWN,WM_LBUTTONUP,向对话框窗口发WM_COMMAND都应该可以