none
.net4.0的程序在xp下运行不正常 RRS feed

  • 问题

  • 我用.net4.0加wpf做了一个很小的项目。是用win7加vs2010开发的。但在最后关节出现了一个问题。
    问题是这样的,项目的最后一个功能是截屏,我用的是sendkeys.sendwait("{PRTSC}")去截屏的。在项目中,一开始我是用的绑定去控制控件的隐藏与显示,后来我是直接找控件的名字去控制控件的隐藏与显示。
    在测试的时候,win7下截多少张图片,保存的图片上不会出现隐藏的控件,但是在xp上,第一张不会出现隐藏的图片,从第二张开始就会一直出现隐藏的控件。
    我是用的c#,请各位高手帮帮我,这个是比较急的,我实在想不出有什么问题。
    我先谢谢啦!
    2011年10月27日 3:00

答案

  • 因为SendKey调用底层API,可能系统来不及反映又去截图第二张了。我建议:

    private void StartThreadTwo()
    {
    Clipboard.Clear();
    string file = AppDomain.CurrentDomain.BaseDirectory + "Capture\\Replace\\" + this.MainCustomer.CustomerName + ".jpg";
    SendKeys.SendWait("{PRTSC}");
    Application.DoEvents();                           //增加这句话
    ……………………
    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月11日 2:46
    版主

全部回复

  • 你好,

    能提供具体的code以便我们重现问题分析原因吗?

     


    Paul Zhou [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月28日 7:50
  • private void OnReplaceClick()
            {
                if (this.th != null)
                {
                    this.th.Abort();
                }

                this.SetHidden();
                this.th = new Thread(() =>
                {
                    Application.Current.Dispatcher.BeginInvoke(
                        (Action)(() =>
                        { this.StartThreadTwo(); }));
                });
                this.th.Start();
                ////this.StartThreadTwo();
            }

            private void StartThreadTwo()
            {
                Clipboard.Clear();
                string file = AppDomain.CurrentDomain.BaseDirectory + "Capture\\Replace\\" + this.MainCustomer.CustomerName + ".jpg";
                // SendKeys.SendWait("{PRTSC}");
                BitmapSource image = ScreenShots.Capture(file);
                if (image != null)
                {
                    FileStream stream = new FileStream(file, FileMode.Create);
                    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(image));
                    encoder.Save(stream);
                    stream.Flush();
                    Thread.Sleep(2000);
                    this.OnStart();
                }
            }

    private void OnStart()
            {
                SearchControl sc = UIHelper.FindChild<SearchControl>(Application.Current.MainWindow, "ctrl");
                sc.IsGridVisible = Visibility.Visible;
                sc.WirteWord = string.Empty;
                this.SetVisible();
                this.webcam = new WebCam();
                this.webcam.InitializeWebCam(ref this.imgVideo);
                this.webcam.Stop();
                this.inkCan.Strokes.Clear();
            }

     

    public class ScreenShots
        {
            [DllImport("user32.dll", EntryPoint = "keybd_event")]
            public static extern void keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);

            public const int KEYEVENTF_KEYUP = 0x0002;

            public const int KEYEVENTF_KEYDOWN = 0x0000;

            public static BitmapSource Capture(string fileName)
            {
                keybd_event((int)Keys.PrintScreen, 0, KEYEVENTF_KEYDOWN, 0);
                keybd_event((int)Keys.PrintScreen, 0, KEYEVENTF_KEYUP, 0);
                Thread.Sleep(3000);
                System.Windows.Forms.SendKeys.SendWait("%{PRTSC}");

                BitmapSource img = Clipboard.GetImage();
                if (img == null)
                {
                    return null;
                }
                else
                {
                    return img;
                }
            }
        }

    这是我的code

    还有,我的window窗体加了allowtranparent=true



    2011年10月28日 8:27
  • 因为SendKey调用底层API,可能系统来不及反映又去截图第二张了。我建议:

    private void StartThreadTwo()
    {
    Clipboard.Clear();
    string file = AppDomain.CurrentDomain.BaseDirectory + "Capture\\Replace\\" + this.MainCustomer.CustomerName + ".jpg";
    SendKeys.SendWait("{PRTSC}");
    Application.DoEvents();                           //增加这句话
    ……………………
    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月11日 2:46
    版主