예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <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));
        }