国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽器-Linux

這篇具有很好參考價(jià)值的文章主要介紹了Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽器-Linux。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽器-Linux版??

更多精彩內(nèi)容
??個(gè)人內(nèi)容分類匯總 ??
??Qt自定義模塊、工具??

1、概述??

  • Qt版本:V5.12.5
  • 兼容系統(tǒng):
    • Windows:這里測(cè)試了Windows10,其它的版本沒有測(cè)試;
    • Linux:這里測(cè)試了ubuntu18.04、20.04,其它的沒有測(cè)試;
    • Mac:等啥時(shí)候我有了Mac電腦再說。
  1. 有時(shí)候我們想獲取到【系統(tǒng)全局鼠標(biāo)事件】,使用Qt的鼠標(biāo)事件、事件過濾器之類的都無法實(shí)現(xiàn),因?yàn)楫?dāng)鼠標(biāo)移出當(dāng)前窗口或者當(dāng)前窗口失去焦點(diǎn)、窗口最小化了就無法獲取到鼠標(biāo)事件了;
  2. 而Linux下想要監(jiān)聽到全局鼠標(biāo)事件就需要使用到X11或者xcb的API來實(shí)現(xiàn);
  3. 在這個(gè)類中通過X11的API監(jiān)聽到全局鼠標(biāo)事件(我沒有使用Xcb);
  4. 然后將監(jiān)聽到的鼠標(biāo)事件映射為QMouseEvent事件,便于在Qt里面使用。

2、實(shí)現(xiàn)效果??

Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽器-Linux

3、實(shí)現(xiàn)方式??

  1. 使用XRecordEnableContext()函數(shù)綁定用于監(jiān)聽全局鼠標(biāo)事件的回調(diào)函數(shù);
  2. 由于XRecordEnableContext會(huì)一直阻塞,所以需要在子線程中調(diào)用;
  3. 通過回調(diào)函數(shù)void callback(XPointer ptr, XRecordInterceptData* data)監(jiān)聽到全局鼠標(biāo)事件;
  4. 使用xEvent * event = reinterpret_cast<xEvent*>(data->data);XRecordInterceptData::data轉(zhuǎn)換為xEvent結(jié)構(gòu)體的指針,可通過這個(gè)結(jié)構(gòu)體獲取當(dāng)前鼠標(biāo)的坐標(biāo)或者鼠標(biāo)滾輪向前還是向后滾動(dòng)的值。
  5. 然后將獲取到的鼠標(biāo)事件映射為QMouseEvent、QWheelEvent事件,發(fā)送給當(dāng)前程序使用;
  6. 這里我使用的是QMouseEvent、QWheelEvent指針進(jìn)行發(fā)送,由于QMouseEvent、QWheelEvent沒有默認(rèn)無參構(gòu)造,所以在Linux下不支持使用信號(hào)發(fā)送QMouseEvent、QWheelEvent變量,所以只能使用指針;
  7. 因?yàn)閭鬟f的是指針,所以在接收信號(hào)的槽函數(shù)里使用完后需要Delete,避免內(nèi)存泄漏;
  8. 簡(jiǎn)易這個(gè)信號(hào)只綁定一次,避免多個(gè)槽函數(shù)里使用同一個(gè)指針,一個(gè)槽函數(shù)釋放了另外一個(gè)槽函數(shù)里出現(xiàn)野指針或者重復(fù)釋放。
  9. 不使用時(shí)需要使用XRecordDisableContext()、XRecordFreeContext()函數(shù)來關(guān)閉監(jiān)聽。

4、關(guān)鍵代碼??

  • 由于使用到了系統(tǒng)API,所以pro文件中需要鏈接系統(tǒng)庫
unix:!macx{
LIBS += -lX11 -lXtst      # linux獲取鼠標(biāo)、鍵盤事件信息需要用到xlib,Xtst 可以安裝sudo apt install libxtst-dev
}
  • globalmouseevent.h
/******************************************************************************
 * @文件名     mouseevent.h
 * @功能       全局鼠標(biāo)事件監(jiān)聽類
 *
 * @開發(fā)者     mhf
 * @郵箱       1603291350@qq.com
 * @時(shí)間       2022/12/07
 * @備注
 *****************************************************************************/
#ifndef MOUSEEVENT_H
#define MOUSEEVENT_H

#include <QObject>

class QMouseEvent;
class QWheelEvent;

/**
 *  全局鼠標(biāo)事件單例信號(hào)類
 */
class GlobalMouseEvent : public QObject
{
    Q_OBJECT
public:
    static GlobalMouseEvent* getInstance()
    {
        static GlobalMouseEvent mouseEvent;
        return &mouseEvent;
    }

    static bool installMouseEvent();      // 安裝全局鼠標(biāo)事件監(jiān)聽器
    static bool removeMouseEvent();       // 卸載全局鼠標(biāo)事件監(jiān)聽器

signals:
    /**
     * @brief 由于傳遞的是指針,為了保證不會(huì)出現(xiàn)內(nèi)存泄露,需要在槽函數(shù)中delete。
     *        建議此信號(hào)只綁定一次,因?yàn)槿绻壎ǘ啻慰赡軙?huì)出現(xiàn)一個(gè)槽函數(shù)里把信號(hào)delete了,另外一個(gè)槽函數(shù)還在使用,出現(xiàn)野指針,或者多個(gè)槽函數(shù)多次delete
     */
    void mouseEvent(QMouseEvent* event);
    void wheelEvent(QWheelEvent* event);

private:
    GlobalMouseEvent(){}
};
#endif // MOUSEEVENT_H

  • globalmouseevent_x11.cpp
#include "globalmouseevent.h"
#if defined(Q_OS_LINUX)
#include <QDebug>
#include <QCursor>
#include <QMouseEvent>
#include <QtConcurrent>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/extensions/record.h>     //  如果找不到可以安裝sudo apt-get install xorg-dev
#include <X11/Xlibint.h>


#if 0     // 方法1:這種方法可以獲取全局鼠標(biāo)事件,但是會(huì)截?cái)嗍髽?biāo)事件,導(dǎo)致其他所有程序都無法獲取到鼠標(biāo)事件
void  sleepMsec(int msec)
{
    QEventLoop loop;		//定義一個(gè)新的事件循環(huán)
    QTimer::singleShot(msec, &loop, SLOT(quit()));//創(chuàng)建單次定時(shí)器,槽函數(shù)為事件循環(huán)的退出函數(shù)
    loop.exec();			//事件循環(huán)開始執(zhí)行,程序會(huì)卡在這里,直到定時(shí)時(shí)間到,本循環(huán)被退出
}

void MouseEventX11()
{
    XEvent xevent;
    int grb;
    Display* display = XOpenDisplay(NULL);      // 首先連接到顯示服務(wù)器
    if(!display) return ;

    unsigned int t_new=0,t_prev=0,t_diff=0;
    int scr = DefaultScreen(display);           // 獲取默認(rèn)屏幕編號(hào)
    Window window = RootWindow(display, scr);   // 獲取根窗口

    while(1)
    {
        XGrabPointer(display,
                     window,
                     true,
                     PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
                     GrabModeAsync,
                     GrabModeAsync,
                     None,
                     None,
                     CurrentTime);
        XAllowEvents(display,AsyncPointer, CurrentTime);
        XNextEvent(display, &xevent);

        qDebug() << Button1Mask <<" " <<Button2Mask<<" " <<Button2Mask<<" " <<Button3Mask<<" " <<Button4Mask<<" " <<Button5Mask;
        qDebug() << Button1 <<" " <<Button2<<" " <<Button2<<" " <<Button3<<" " <<Button4<<" " <<Button5;
        switch (xevent.type) {
        case MotionNotify:
        {
            qDebug() << "運(yùn)動(dòng)事件";
            break;
        }
        case ButtonPress:
        {
            qDebug() << xevent.xbutton.button;
            switch (xevent.xbutton.button)
            {
                case 1:
                qDebug() << QString("左鍵單擊:[%1, %2]").arg(xevent.xbutton.x_root).arg(xevent.xbutton.y_root);
                t_prev=t_new;
                break;
                case 2:
                qDebug() << "單擊鼠標(biāo)中鍵";
                break;
                case 3:
                qDebug() << "單擊鼠標(biāo)右鍵";
                break;
                case 4:
                qDebug() << "向上滾動(dòng)";
                break;
                case 5:
                qDebug() << "向下滾動(dòng)";
                break;
            }
            break;
          }
        case ButtonRelease:
        {
            switch (xevent.xbutton.button)
            {
                case 1:
                qDebug() << QString("左鍵釋放:[%1, %2]").arg(xevent.xbutton.x_root).arg(xevent.xbutton.y_root);
                t_prev=t_new;
                break;
                case 2:
                qDebug() << "釋放鼠標(biāo)中鍵";
                break;
                case 3:
                qDebug() << "釋放鼠標(biāo)右鍵";
                break;
                case 4:
                qDebug() << "向上滾動(dòng)";
                break;
                case 5:
                qDebug() << "向下滾動(dòng)";
                break;
            }
            break;
          }
        }
        sleepMsec(1);
    }
    XUngrabPointer(display,CurrentTime);
}
#else

// 使用static修飾全局函數(shù)和全局變量:只能在本源文件使用
static XRecordContext g_context = 0;
static Display* g_display = nullptr;

static bool init()
{
    g_display =XOpenDisplay(nullptr);           // 打開與控制顯示器的X服務(wù)器的連接,詳細(xì)說明看【https://tronche.com/gui/x/xlib/display/opening.html】
    if(!g_display)
    {
        qWarning() << "連接X服務(wù)失??!";
        return false;
    }
    XRecordClientSpec clients = XRecordAllClients;     // 初始化 XRecordCreateContext 所需的 XRecordClientSpec 參數(shù),XRecordAllClients 的意思是 "記錄所有 X Client" 的事件
    XRecordRange*range = XRecordAllocRange();          // 創(chuàng)建 XRecordRange 變量,用于控制記錄事件的范圍
    if (!range)
    {
        qDebug() << "無法分配XRecordRange";
        return false;
    }

    // 會(huì)監(jiān)聽到 first - last之間并包含first和last的所有類型的事件
    memset(range, 0, sizeof(XRecordRange));
    range->device_events.first = ButtonPress;
    range->device_events.last  = MotionNotify;
    // 根據(jù)上面的記錄客戶端類型和記錄事件范圍來創(chuàng)建 “記錄上下文”
    // 然后把 XRecordContext 傳遞給 XRecordEnableContext 函數(shù)來開啟事件記錄循環(huán)
    g_context = XRecordCreateContext(g_display, 0, &clients, 1,&range, 1);
    XFree(range);
    if(g_context == 0)
    {
        qWarning() << "創(chuàng)建事件記錄上下文失?。?;
        return false;
    }
    XSync(g_display, false);              // XSync 的作用就是把上面的X 代碼立即發(fā)給 X Server,這樣 X Server 接受到事件以后會(huì)立即發(fā)送給 XRecord 的 Client 連接  True

    return true;
}

/**
 * @brief      處理鼠標(biāo)事件的回調(diào)函數(shù),將X11鼠標(biāo)事件轉(zhuǎn)換為Qt鼠標(biāo)事件,通過單例類MouseEvent發(fā)送出去
 * @param ptr
 * @param data
 */
static void callback(XPointer ptr, XRecordInterceptData* data)
{
    Q_UNUSED(ptr)

    if (data->category == XRecordFromServer)
    {
        xEvent * event  = reinterpret_cast<xEvent*>(data->data);
//      qDebug() << QString("鼠標(biāo)坐標(biāo):[%1, %2]").arg(event->u.keyButtonPointer.rootX).arg(event->u.keyButtonPointer.rootY);   // 獲取鼠標(biāo)坐標(biāo)
        switch (event->u.u.type)            // 動(dòng)作類型
        {
        case ButtonPress:                   //鼠標(biāo)按下
        {
            QPoint point = QCursor::pos();  // 獲取鼠標(biāo)當(dāng)前位置
            switch (event->u.u.detail)      // 按鍵類型
            {
            case Button1:     // 左鍵按下
            {
                emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
                break;
            }
            case Button2:     // 中鍵按下
            {
                emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::MiddleButton, Qt::MiddleButton, Qt::NoModifier));
                break;
            }
            case Button3:     // 右鍵按下
            {
                emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
                break;
            }
            case Button4:     // 向前滾動(dòng)
            {
                emit GlobalMouseEvent::getInstance()->wheelEvent(new QWheelEvent(point, 120, Qt::MiddleButton, Qt::NoModifier));
                break;
            }
            case Button5:     // 向后滾動(dòng)
            {
                emit GlobalMouseEvent::getInstance()->wheelEvent(new QWheelEvent(point, -120, Qt::MiddleButton, Qt::NoModifier));
                break;
            }
            default:
            {
                qDebug() << QString("未定義的按鍵:%1").arg(event->u.u.detail);   // 比如很多鼠標(biāo)邊上會(huì)多幾個(gè)鍵
                break;
            }
            }
            break;
        }
        case MotionNotify:                              // 鼠標(biāo)移動(dòng)
        {
            emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseMove, QCursor::pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier));
        }
        case ButtonRelease:                             // 鼠標(biāo)釋放
        {
            QPoint point = QCursor::pos();  // 獲取鼠標(biāo)當(dāng)前位置
            switch (event->u.u.detail)      // 按鍵類型
            {
            case Button1:   // 左鍵釋放
            {
                emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
                break;
            }
            case Button2:   // 中鍵釋放
            {
                emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::MiddleButton, Qt::MiddleButton, Qt::NoModifier));
                break;
            }
            case Button3:   // 右鍵釋放
            {
                emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
                break;
            }
            case Button4:   // 向前滾動(dòng)
            {
                break;
            }
            case Button5:   // 向后滾動(dòng)
            {
                break;
            }
            default:
            {
//                qDebug() << QString("未定義的按鍵:%1").arg(event->u.u.detail);   // 比如很多鼠標(biāo)邊上會(huì)多幾個(gè)鍵
            }
            }
            break;
        }
        default:
            break;
        }
    }

    XRecordFreeData(data);
}

/**
 * 調(diào)用 XRecordEnableContext 函數(shù)建立 XRecord 上下文
 * X Server 事件一旦發(fā)生就傳遞給事件處理回調(diào)函數(shù)
 * XRecordEnableContext 函數(shù)一旦調(diào)用就開始進(jìn)入堵塞時(shí)的事件循環(huán),直到線程或所屬進(jìn)程結(jié)束
 */
static void enableContext()
{
    Status ret = XRecordEnableContext(g_display, g_context,  callback, nullptr);
    XCloseDisplay(g_display);    // 關(guān)閉連接
    g_display = nullptr;
    qDebug() << QString("退出事件監(jiān)聽:%1").arg(ret);
}
#endif

/**
 * @brief  安裝全局鼠標(biāo)事件監(jiān)聽器
 * @return true:安裝成功 false:失敗
 */
bool GlobalMouseEvent::installMouseEvent()
{
    bool ret = init();
    if(!ret) return false;
    QtConcurrent::run(enableContext);   // 由于XRecordEnableContext會(huì)一直阻塞,所以需要在線程中調(diào)用
    return true;
}

/**
 * @brief   卸載全局鼠標(biāo)事件監(jiān)聽器,注意:如果不卸載事件監(jiān)聽則導(dǎo)致子線程會(huì)一直存在,程序無法正常退出
 * @return  true:卸載成功 false:失敗
 */
bool GlobalMouseEvent::removeMouseEvent()
{
    if(g_context == 0) return false;

    Display* display = XOpenDisplay(nullptr);         // 這里需要單獨(dú)建立一個(gè)連接來關(guān)閉監(jiān)聽,否則XRecordEnableContext不會(huì)退出
    if(!display)
    {
        qWarning() << "連接X服務(wù)失??!";
        return false;
    }
    XRecordDisableContext(display, g_context);
    XFlush(display);
    XSync(display, false);

    XRecordFreeContext(display, g_context);           // 釋放監(jiān)聽上下文,否則XRecordEnableContext不會(huì)退出
    g_context = 0;
    XCloseDisplay(display);
    return true;
}


#endif

5、源代碼??

  • gitee
  • github
  • 全局鼠標(biāo)鍵盤事件監(jiān)聽器倉庫github
  • 全局鼠標(biāo)鍵盤事件監(jiān)聽器倉庫gitee
  • CSDN
  • 可以使用命令git clone https://gitee.com/mahuifa/QtGlobalEvent.git直接下載倉庫,然后引用到自己的程序中。

????????????????????????文章來源地址http://www.zghlxwxcb.cn/news/detail-509223.html

到了這里,關(guān)于Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽器-Linux的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • laravel框架 - 事件與監(jiān)聽器

    laravel框架 - 事件與監(jiān)聽器

    在 appProviders 下的 EventServiceProvider.php 中添加我們定義的事件與監(jiān)聽器 使用 event:generate 命令即可。 這個(gè)命令會(huì)生成在 EventServiceProvider 中列出的所有事件和監(jiān)聽器。當(dāng)然,已經(jīng)存在的事件和監(jiān)聽器將保持不變: ?在Applisteners目錄下,打開你新創(chuàng)建的 監(jiān)聽器 文件 SendMessage.php

    2024年02月07日
    瀏覽(22)
  • Spring高手之路7——事件機(jī)制與監(jiān)聽器的全面探索

    Spring高手之路7——事件機(jī)制與監(jiān)聽器的全面探索

    ??觀察者模式是一種行為設(shè)計(jì)模式,它定義了對(duì)象之間的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新。在這個(gè)模式中,改變狀態(tài)的對(duì)象被稱為主題,依賴的對(duì)象被稱為觀察者。 舉個(gè)實(shí)際的例子: 事件源(Event Source) :可以視

    2024年02月11日
    瀏覽(25)
  • Unity UGUI的EventTrigger (事件監(jiān)聽器)組件的介紹及使用

    EventTrigger是Unity UGUI中的一個(gè)組件,用于監(jiān)聽和響應(yīng)UI元素的各種事件,例如點(diǎn)擊、拖拽、進(jìn)入、離開等。通過EventTrigger組件,我們可以方便地為UI元素添加各種交互行為。 EventTrigger組件通過監(jiān)聽UI元素上的事件,并在事件觸發(fā)時(shí)執(zhí)行相應(yīng)的回調(diào)函數(shù)。每個(gè)UI元素可以添加多個(gè)

    2024年02月15日
    瀏覽(20)
  • Listener監(jiān)聽器,實(shí)現(xiàn)一個(gè)顯示在線用戶人數(shù)

    Listener監(jiān)聽器,實(shí)現(xiàn)一個(gè)顯示在線用戶人數(shù)

    目錄 Listener監(jiān)聽器,實(shí)現(xiàn)一個(gè)顯示在線用戶人數(shù) 每博一文案 1. Listener 監(jiān)聽器的概述 2. Listener 監(jiān)聽器在 Servlet 的體系結(jié)構(gòu) 3. 編寫一個(gè) Listener 監(jiān)聽器的過程 3.1 ServletContextListener 4. 其他Listener 監(jiān)聽器的使用: 4.1 ServletRequestListener 4.2 HttpSessionListener 4.3 HttpSessionAttributeListener 4.4 H

    2024年02月03日
    瀏覽(58)
  • web3j的基礎(chǔ)用法-6合約的監(jiān)聽器事件Event和過濾器EthFilter,以及NullPointed,調(diào)用失敗導(dǎo)致的bug解決

    web3j的基礎(chǔ)用法-6合約的監(jiān)聽器事件Event和過濾器EthFilter,以及NullPointed,調(diào)用失敗導(dǎo)致的bug解決

    本篇以Uniswap為例(https://uniswap.org/) 合約地址 :0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 (Uni) 監(jiān)聽合約Tranfer事件 調(diào)用代碼 核心代碼實(shí)現(xiàn)在這里 之前實(shí)驗(yàn)全量區(qū)塊,導(dǎo)致請(qǐng)求多次失敗,是由于個(gè)人RPC節(jié)點(diǎn)的請(qǐng)求和數(shù)據(jù)有限,為了測(cè)試出結(jié)果,從13763721L block到當(dāng)前,結(jié)果毫秒級(jí)返

    2024年02月11日
    瀏覽(29)
  • 207、SpringBoot 整合 RabbitMQ 實(shí)現(xiàn)消息的發(fā)送 與 接收(監(jiān)聽器)

    207、SpringBoot 整合 RabbitMQ 實(shí)現(xiàn)消息的發(fā)送 與 接收(監(jiān)聽器)

    1、ContentUtil 先定義常量 2、RabbitMQConfig 創(chuàng)建隊(duì)列的兩種方式之一: 配置式: 在容器中配置 org.springframework.amqp.core.Queue 類型的Bean,RabbitMQ將會(huì)自動(dòng)為該Bean創(chuàng)建對(duì)應(yīng)的隊(duì)列。 就是在配置類中創(chuàng)建一個(gè)生成消息隊(duì)列的@Bean。 問題: 用 @Configuration 注解聲明為配置類,但是項(xiàng)目啟動(dòng)

    2024年02月06日
    瀏覽(25)
  • HttpSessionListener監(jiān)聽器和HttpSessionAttributeListener監(jiān)聽器

    1.作用:監(jiān)聽Session創(chuàng)建或銷毀,即生命周期監(jiān)聽 2.相關(guān)方法: 3.使用場(chǎng)景: 和前面的ServletContextListener等一樣,可以用于監(jiān)控用戶上線和離線 4.代碼 HttpSessionListener監(jiān)聽器 實(shí)現(xiàn)類 HttpSessionAttributeListener監(jiān)聽器 1.作用:監(jiān)聽Session屬性的變化,使用少 2.相關(guān)方法: 3.代碼 監(jiān)聽器 實(shí)

    2024年02月04日
    瀏覽(20)
  • Listener監(jiān)聽器----HttpServletRequest對(duì)象的生命周期監(jiān)聽器

    一、HttpServletRequest對(duì)象的生命周期監(jiān)聽器 ????????ServletRequestListener接口定義了ServletRequest(是HttpServletRequest接口的父接口類型)對(duì)象生命周期的監(jiān)聽行為。 void requestInitialized(ServletRequestEvent sre) ??????? HttpServletRequest對(duì)象創(chuàng)建后會(huì)觸發(fā)該監(jiān)聽器方法,并將已創(chuàng)建HttpServletR

    2024年01月23日
    瀏覽(23)
  • camunda執(zhí)行監(jiān)聽器和任務(wù)監(jiān)聽器有什么區(qū)別

    camunda執(zhí)行監(jiān)聽器和任務(wù)監(jiān)聽器有什么區(qū)別

    Camunda的執(zhí)行監(jiān)聽器和任務(wù)監(jiān)聽器是用于添加自定義邏輯的監(jiān)聽器,它們的區(qū)別在于作用對(duì)象和觸發(fā)事件的不同。 執(zhí)行監(jiān)聽器是與BPMN流程中的各種流程元素(例如開始事件、用戶任務(wù)、服務(wù)任務(wù)、網(wǎng)關(guān)等)相關(guān)聯(lián)的。執(zhí)行監(jiān)聽器可以在流程元素執(zhí)行前、執(zhí)行后或拋出異常時(shí)添

    2024年02月04日
    瀏覽(39)
  • 消息監(jiān)聽器和消息監(jiān)聽容器

    前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。 消息監(jiān)聽器顧名思義用來接收消息,它是使用消息監(jiān)聽容器的必須條件。目前有8個(gè)消息監(jiān)聽器: 使用自動(dòng)提交或容器管理的提交方法之一,處理從 Kafka 消費(fèi)者 p

    2024年02月07日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包