/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MainForm_Load(object sender, EventArgs e) { // グローバルフック using (Process process = Process.GetCurrentProcess()) using (ProcessModule module = process.MainModule) { // フックプロシージャを登録 MouseHookInfo.hHook = MouseHookAPI.SetWindowsHookEx( MouseHookInfo.WH_MOUSE_LL, mouse_proc = new MouseHookAPI.HookProcedureDelegate(MouseHookProc), MouseHookAPI.GetModuleHandle(module.ModuleName), 0); } if (MouseHookInfo.hHook == IntPtr.Zero) { MessageBox.Show("SetWindowsHookEx Failed."); } // EvidenceAppliを最前面に持ってくるための処理(最前面にしっぱなしにはしない) this.TopMost = true; this.Activate(); this.TopMost = false; }
/// <summary> /// /// </summary> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> public IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { // 選択状態のみ受け入れる MouseHookInfo.MouseHookStruct MyMouseHookStruct = (MouseHookInfo.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookInfo.MouseHookStruct)); switch ((int)wParam) { case MouseHookInfo.WM_LBUTTONDOWN: { if (m_st == Status.FSELECT) { // フォームの場合 // EvidencdAppliを最前面にする this.TopMost = true; } else if ((m_st == Status.RSELECT) || (m_st == Status.RCANCEL)) { // 矩形の場合 // マウス座標の取得 System.Drawing.Point p = new System.Drawing.Point(); GetCursorPos(ref p); // 撮影時は不可視にしたので廃止・・・ //System.Drawing.Rectangle rect = this.ClientRectangle; //System.Drawing.Point mouseClientPos = this.PointToClient(p); //if (rect.Contains(mouseClientPos)) //{ // // EvidenceAppli内で押されていたら抜ける // m_isDragging = false; // break; //} // マウス座標をクライアント座標系へ変換 m_sp = m_FullScreen.PointToClient(p); // ドラッグ開始 m_isDragging = true; } break; } case MouseHookInfo.WM_LBUTTONUP: { if (m_st == Status.FSELECT) { // フォーム選択 // マウス座標の取得 System.Drawing.Point p = new System.Drawing.Point(); GetCursorPos(ref p); /* * キャプチャボタン上で反応しないようにする */ System.Drawing.Rectangle rect = this.ClientRectangle; // マウス座標をクライアント座標系へ変換 System.Drawing.Point mouseClientPos = this.PointToClient(p); if (rect.Contains(mouseClientPos)) { // EvidenceAppli内で押されたら、hWndを更新しない break; } else { // EvidenceAppliの外で押されたら、hWndを更新する hWnd = WindowFromPoint(p); if (hWnd == IntPtr.Zero) { break; } } /* * ウィンドウ情報を取得してラベルに表示 */ //ウィンドウのタイトルの長さを取得する int textLen = GetWindowTextLength(hWnd); if (0 < textLen) { //ウィンドウのタイトルを取得する StringBuilder tsb = new StringBuilder(textLen + 1); GetWindowText(hWnd, tsb, tsb.Capacity); //ウィンドウのクラス名を取得する StringBuilder csb = new StringBuilder(256); GetClassName(hWnd, csb, csb.Capacity); //結果を表示する Console.WriteLine("クラス名:" + csb.ToString()); Console.WriteLine("タイトル:" + tsb.ToString()); captuerTargetInfo.Text = tsb.ToString(); // 画像選択中にする m_st = Status.HOLD; SetButtonStatus(m_st); } } else if ((m_st == Status.RCAPTURE) || (m_st == Status.RSELECT)) { // 矩形 if (m_isDragging == false) { // ドラッグ中じゃないなら抜ける break; } // マウス座標の取得 System.Drawing.Point p = new System.Drawing.Point(); GetCursorPos(ref p); // マウス座標をクライアント座標系へ変換 m_ep = m_FullScreen.PointToClient(p); /* * 矩形選択 */ System.Drawing.Point start = new System.Drawing.Point(); System.Drawing.Point end = new System.Drawing.Point(); GetRegion(m_sp, m_ep, ref start, ref end); captuerTargetInfo.Text = "左上座標:[" + start.X.ToString() + @"," + start.Y.ToString() + @"]" + " - 右下座標:[" + end.X.ToString() + @"," + end.Y.ToString() + @"]"; // 状態を画像選択中にする m_st = Status.RHOLD; SetButtonStatus(m_st); // 矩形キャプチャが終わったのでm_FullScreenは捨てる m_FullScreen.TopMost = false; m_FullScreen.Close(); if (m_FullScreenbmp != null) { m_FullScreenbmp.Dispose(); } // EvidenceAppliを可視化して、つかえるようにする this.Opacity = 1; this.Activate(); this.clear_button.Focus(); this.Show(); /// m_FullScreenからフォーカスが戻らないので強制的にクリックイベントを発生させる mouse_event(0x4, 0, 0, 0, 0); // ドラッグ終了 m_isDragging = false; } break; } case MouseHookInfo.WM_LBUTTONDBLCLK: { break; } case MouseHookInfo.WM_RBUTTONDOWN: { break; } case MouseHookInfo.WM_RBUTTONUP: { break; } case MouseHookInfo.WM_RBUTTONDBLCLK: { break; } case MouseHookInfo.WM_MBUTTONDOWN: { break; } case MouseHookInfo.WM_MBUTTONUP: { break; } case MouseHookInfo.WM_MBUTTONDBLCLK: { break; } case MouseHookInfo.WM_MOUSEMOVE: { if (m_st == Status.RSELECT) { if (m_isDragging == false) { // ドラッグ中じゃないなら抜ける break; } // 現在のマウスの座標を取得して枠線を描く System.Drawing.Point p = new System.Drawing.Point(); GetCursorPos(ref p); System.Drawing.Point start = new System.Drawing.Point(); System.Drawing.Point end = new System.Drawing.Point(); // 座標から(X,Y)座標を計算 GetRegion(m_sp, m_FullScreen.PointToClient(p), ref start, ref end); // 前回書いた枠を残さないように画面更新 m_FullScreen.Refresh(); DrawRegion(start, end); } break; } case MouseHookInfo.WM_MOUSEWHEEL: { break; } } } return(MouseHookAPI.CallNextHookEx(MouseHookInfo.hHook, nCode, wParam, lParam)); }