亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#如何實現QQ截圖功能

發布時間:2020-08-03 11:20:00 來源:億速云 閱讀:252 作者:小豬 欄目:編程語言

這篇文章主要講解了C#如何實現QQ截圖功能,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

對于QQ截圖,肯定是早就有認識了,只是一直沒有去認真觀察這個操作的具體實現步驟。所以這里將自己的記憶中的步驟簡單的寫一下:

習慣性用QQ或者TIM的人,一般是使用Ctrl+Alt+A  快捷鍵(熱鍵)快速實現截圖。

  • Ctrl+Alt+A  進入截圖模式
  • 鼠標左鍵點擊
  • 鼠標拖動對截圖去進行選取
  • 鼠標左鍵彈起
  • 雙擊截圖區域  保存圖片到剪貼板
  • 鼠標右鍵點擊
  • 退出截圖模式

C#如何實現QQ截圖功能

因為考慮到截圖模式的時候  一般只能顯示一個窗體  所以就考慮使用單例模式  在ScreenBody窗體中實現以下代碼

1:創建單例 

private static ScreenBody screenBody=null;

2:私有化構造函數

private ScreenBody()
{
InitializeComponent();
}

3:創建靜態方法

private static ScreenBody GetSingle()
{
if(screenBody==null)
{
screenBody=new ScreenBody();
}
return screenBody;
}

進一步討論一下在Main窗體中的調用  Main中添加了一個button 命名為btnCutter 

private void btnCutter_Click(object sender,EventArgs e)
{
 //新建一個和屏幕大小相同的圖片img 也可以用BitMap
image img=new Bitmap(Screen.AllScreens[0].Bounds.Width,Screen.AllScreens[0].Bounds.Height);
//創建一個畫板 讓我們可以在畫板上畫圖 大小和屏幕大小一樣大
Graphics g=Graphics.FromImage(img);
 //將屏幕圖片拷貝到空白圖片img
g.CopyFromScreen(new Point(0,0),new Point(0,0),Screen.AllScreens[0].Bounds.Size);
//創建截圖窗體
ScreenBody body=ScreenBody.GetSingle();
//指示窗體的背景圖片為屏幕圖片
body.BackGroundImage=img;
body.ShowDialog();

}

對于窗體ScreenBody

聲明全局變量

private bool CatchStart;//判斷鼠標是否按下
private bool CatchFinished;//判斷矩形是否繪制完成
private Point DownPoint;//鼠標按下的點
private Image baseMap;//最基本的圖片
private Rectangle CatchRectangle; 

必須要實現的那幾個事件

鼠標按下MouseDown

 private void ScreenBody_MouseDown(object sender, MouseEventArgs e)
 {
  //鼠標左鍵按下就是開始畫圖,也就是截圖
  if (e.Button == MouseButtons.Left)
  {
  if (CatchStart == false)
  {
   CatchStart = true;
   //保存此時的坐標
   DownPoint = new Point(e.X, e.Y);
  }
  }
 }

鼠標移動 MouseMove

 private void ScreenBody_MouseMove(object sender, MouseEventArgs e)
 {
  //確保截圖開始
  if (CatchStart)
  {
  //新建一個圖片,讓它與屏幕圖片相同
  Bitmap copyBmp = (Bitmap)baseMap.Clone();
  //鼠標按下時的坐標
  Point newPoint = new Point(DownPoint.X, DownPoint.Y);

  //新建畫板和畫筆
  Graphics g = Graphics.FromImage(copyBmp);
  Pen p = new Pen(Color.Azure, 1);//畫筆的顏色為azure 寬度為1

  //獲取矩形的長度 
  int width = Math.Abs(e.X - DownPoint.Y);
  int height = Math.Abs(e.Y - DownPoint.Y);

  if (e.X < DownPoint.X)
  {
   newPoint.X = e.X;

  }
  if (e.Y < DownPoint.Y)
  {
   newPoint.Y = e.Y;
  }

  CatchRectangle = new Rectangle(newPoint, new Size(width, height));
  g.DrawRectangle(p, CatchRectangle);

  //釋放目前的畫板
  g.Dispose();
  p.Dispose();

  //從當前窗體創建新的畫板
  Graphics g1 = this.CreateGraphics();
  //將剛剛所畫的圖片畫到截圖窗體上去
  //為什么不直接在當前窗體畫圖呢???
  //如果直接解決將矩形畫在窗體上,會造成圖片抖動而且有多個矩形
  //這樣實現也屬于二次緩沖技術
  g1.DrawImage(copyBmp, new Point(0, 0));
  g1.Dispose();

  //釋放拷貝圖片 防止內存被大量的消耗
  copyBmp.Dispose();
  }

鼠標彈起 Mouseup

 /// <summary>
 /// 鼠標左鍵彈起事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void ScreenBody_MouseUp(object sender, MouseEventArgs e)
 {
  if (e.Button == MouseButtons.Left)
  {
  //如果截圖已經開始,鼠標左鍵彈起設置截圖完成
  if (CatchStart)
  {
   CatchStart = false;
   CatchFinished = true;
  }
  }
 }

鼠標雙擊

 private void ScreenBody_MouseDoubleClick(object sender, MouseEventArgs e)
 {
  if (e.Button==MouseButtons.Left&&CatchFinished)
  {
  //新建一個矩形大小相同的空白圖片
  Bitmap CatcheBmp = new Bitmap(CatchRectangle.Width, CatchRectangle.Height);
  Graphics g = Graphics.FromImage(CatcheBmp); ;
  
  //把basemap中指定的部分按照指定大小畫到空白圖片上
  //CatchRectangle指定的baseMap中指定的部分
  //第二個參數指定繪制到空白圖片的位置和大小
  //畫完后CatchedBmp不再是空白圖片,而是具有與截取的圖片一樣的內容
  g.DrawImage(baseMap, new Rectangle(0, 0, CatchRectangle.Width, CatchRectangle.Height));

  //將圖片保存到剪切板中
  Clipboard.SetImage(CatcheBmp);
  g.Dispose();

  CatchFinished = false;
  this.BackgroundImage = baseMap;
  CatcheBmp.Dispose();
  this.DialogResult = DialogResult.OK;
  this.Close();
  }
 }

鼠標右鍵 退出截圖

/// <summary>
 /// 鼠標右鍵點擊結束截圖
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void ScreenBody_MouseClick(object sender, MouseEventArgs e)
 {
  if (e.Button == MouseButtons.Right)
  {
  this.DialogResult = DialogResult.OK;
  this.Close();
  }
 }

最復雜的熱鍵注冊  自己也是去網上看的  Main窗體中

聲明枚舉

[FlagsAttribute]
 public enum KeyModifiers
 {
 None = 0,
 Alt = 1,
 Ctrl = 2,
 Shift = 4,
 WindowsKey = 8
 }

然后在類中編輯一下代碼

 //在C#中引用命名空間System.Runtime.InteropServices;來加載非托管類user32.dll
 /*
 * RegisterHotKey函數原型及說明:
 * BOOL RegisterHotKey(
 * HWND hWnd,  // window to receive hot-key notification
 * int id,  // identifier of hot key
 * UINT fsModifiers, // key-modifier flags
 * UINT vk  // virtual-key code);
 * 參數 id為你自己定義的一個ID值
 * 對一個線程來講其值必需在0x0000 - 0xBFFF范圍之內,十進制為0~49151
 * 對DLL來講其值必需在0xC000 - 0xFFFF 范圍之內,十進制為49152~65535
 * 在同一進程內該值必須唯一參數 fsModifiers指明與熱鍵聯合使用按鍵
 * 可取值為:MOD_ALT MOD_CONTROL MOD_WIN MOD_SHIFT參數,或數字0為無,1為Alt,2為Control,4為Shift,8為Windows
 * vk指明熱鍵的虛擬鍵碼
 */
 [System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函數
 public static extern bool RegisterHotKey(
  IntPtr hWnd, // handle to window
  int id, // hot key identifier
  uint fsModifiers, // key-modifier options
  Keys vk // virtual-key code
 );

 [System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函數
 public static extern bool UnregisterHotKey(
  IntPtr hWnd, // handle to window
  int id // hot key identifier
 );

再接著

 private void Form1_Load(object sender, EventArgs e)
 {
  uint ctrlHotKey = (uint)(KeyModifiers.Alt | KeyModifiers.Ctrl);
  // 注冊熱鍵為Alt+Ctrl+C, "100"為唯一標識熱鍵
  RegisterHotKey(Handle, 100, ctrlHotKey, Keys.A);
 }
 //熱鍵按下執行的方法
 private void GlobalKeyProcess()
 {
  this.WindowState = FormWindowState.Minimized;
  //窗口最小化需要一定的時間 使用線程
  Thread.Sleep(200);
  btnCutter.PerformClick();
 }

 protected override void WndProc(ref Message m)
 {
  //如果m.Msg的值為0x0312那么表示用戶按下了熱鍵
  const int WM_HOTKEY = 0x0312;
  switch (m.Msg)
  {
  case WM_HOTKEY:
   if (m.WParam.ToString()=="100")
   {
   GlobalKeyProcess();
   }
   break;
  default:
   break;
  }
  base.WndProc(ref m);
 }

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
  // 卸載熱鍵
  UnregisterHotKey(Handle, 100);
 }

熱鍵的功能就能實現。但是我遇到了很多問題  首先是basemap  沒有初始化值

C#如何實現QQ截圖功能C#如何實現QQ截圖功能

這些問題  還有待解決!!!

看完上述內容,是不是對C#如何實現QQ截圖功能有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

潜山县| 华宁县| 高淳县| 四子王旗| 明星| 玛纳斯县| 承德县| 海林市| 海安县| 忻州市| 峨眉山市| 嘉禾县| 黎平县| 东港市| 阿鲁科尔沁旗| 临朐县| 南京市| 治多县| 汨罗市| 兴隆县| 汾阳市| 濉溪县| 凤阳县| 信丰县| 邻水| 墨玉县| 和平区| 昌图县| 乐安县| 拜泉县| 定陶县| 高安市| 宁都县| 阿城市| 南宫市| 开鲁县| 安西县| 长垣县| 巴里| 南召县| 吉林市|