none
关于同一段代码(SendKeys截屏)在不同系统上运行的问题 RRS feed

  • 问题

  • 代码如下,Windows旗舰版运行是有的可以(VS2010Sp1补丁没打,.net也是)有的不可以(VS2010打上了SP1补丁,.net也打上所有自动更新的补丁),Windows7专业版不可以(VS2010打上了SP1补丁,.net也打上所有自动更新的补丁),XP完全可以。

    当程序运行时候,点击第一个按钮然后点击截图,无法保存图片;点击第二个按钮然后再次点击截图按钮,保存却是第一次点击按钮的情况,不知为什么。求高手赐教,Thanks!

    难道会是补丁的问题?!

    namespace AltPrScrn_test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private int i = 0;
    
            private void button1_Click(object sender, EventArgs e)
            {
                textBox1.Text = "按下了Btn1,请截图";
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                textBox1.Text = "按下了Btn2,请截图";
            }
    
            private void BtnPic_Click(object sender, EventArgs e)
            {
                try
                {
                    i++;
                    SendKeys.Send("%{prtsc}");
                    Application.DoEvents();
                    IDataObject mycapture = Clipboard.GetDataObject();
                    if (mycapture.GetDataPresent(typeof(Bitmap)))
                    {
                        Bitmap bt = (Bitmap)mycapture.GetData(typeof(Bitmap));
                        bt.Save(@"C:\" + DateTime.Now.ToString("yyyyMMdd") + i.ToString("_00#") + ".Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
                    }
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                Clipboard.Clear();
            }
        }
    }
    

    可留下Email向我索取代码。


    Yang




    • 已编辑 zjyh16 2011年9月9日 8:07
    2011年9月9日 7:51

答案

  • 那个不保险的。建议直接用 PrintWindow API。那个 API 也很好用。看看 MSDN 就明白了。
    Mark Zhou
    • 已标记为答案 zjyh16 2011年9月14日 4:24
    2011年9月12日 9:47
  • 你好!

    建议直接从显存中直接 COPY 屏幕图像,与 API 相比这样更高效。如下代码:

    Screen scr = Screen.PrimaryScreen;
                Rectangle rc = scr.Bounds;
                int iWidth = rc.Width;
                int iHeight = rc.Height;
                Bitmap  myImage = new Bitmap(iWidth, iHeight);
                Graphics g1 = Graphics.FromImage(myImage);
                g1.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(iWidth, iHeight));
    


    知识改变命运,奋斗成就人生!
    • 已标记为答案 zjyh16 2011年9月14日 4:24
    2011年9月14日 2:58
    版主

全部回复

  • 那个不保险的。建议直接用 PrintWindow API。那个 API 也很好用。看看 MSDN 就明白了。
    Mark Zhou
    • 已标记为答案 zjyh16 2011年9月14日 4:24
    2011年9月12日 9:47
  • 谢谢~终于有人回答了,好吧,去看看API。


    Yang
    • 已标记为答案 zjyh16 2011年9月14日 4:24
    • 取消答案标记 zjyh16 2011年9月14日 4:24
    2011年9月13日 1:52
  • 你好!

    建议直接从显存中直接 COPY 屏幕图像,与 API 相比这样更高效。如下代码:

    Screen scr = Screen.PrimaryScreen;
                Rectangle rc = scr.Bounds;
                int iWidth = rc.Width;
                int iHeight = rc.Height;
                Bitmap  myImage = new Bitmap(iWidth, iHeight);
                Graphics g1 = Graphics.FromImage(myImage);
                g1.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(iWidth, iHeight));
    


    知识改变命运,奋斗成就人生!
    • 已标记为答案 zjyh16 2011年9月14日 4:24
    2011年9月14日 2:58
    版主
  • 谢谢~简单而高效正是我需要的。先去试试看。
    Yang
    2011年9月14日 3:01