许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  NX二次开发:使用鼠标和键盘钩子(Hook)实现高级交互

NX二次开发:使用鼠标和键盘钩子(Hook)实现高级交互

阅读数 6
点赞 0
article_banner

环境:Win7 x64,VS2015,NX12


内容 NX   UI 事件响应_使用快捷键Delete删除树控件某一行,键盘按下H键

          NX UI   事件响应_鼠标左键按下和鼠标滑动  


注意

一定要在NX UI 构造函数中添加响应事件

一定要在NX UI 构造函数中添加响应事件

一定要在NX UI 构造函数中添加响应事件


代码

CHookCallback.hpp (核心:事件响应基类

CHookCallback.hpp 需要stdafx.h,targetver.h文件,可通过创建MFC项目得到。

#pragma once #include "stdafx.h"#include <iostream>#undef StrToInt class CHookCallback{public:    CHookCallback();    virtual ~CHookCallback();    void RemoveHook(int idHook);    void RemoveAllHooks();    BOOL AddHook(int idHook, HINSTANCE hmod = 0, DWORD dwThreadId = GetCurrentThreadId());    void Reset();   //自定义,用于NX对话框,每次对话框开始时重置静态变量      static LRESULT CALLBACK hookMSGFILTER(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookJOURNALRECORD(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookJOURNALPLAYBACK(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookKEYBOARD(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookKEYBOARDLL(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookGETMESSAGE(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookCALLWNDPROC(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookCBT(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookSYSMSGFILTER(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookMOUSE(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookDEBUG(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookSHELL(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookFOREGROUNDIDLE(int code, WPARAM wParam, LPARAM lParam);    static LRESULT CALLBACK hookCALLWNDPROCRET(int code, WPARAM wParam, LPARAM lParam);    static LRESULT HookProc(int idHook, int code, WPARAM wParam, LPARAM lParam);     virtual void HookCallback(int idHook, int code, WPARAM wParam, LPARAM lParam); private:    static CPtrList m_HookID[WH_MAX - WH_MIN + 1];     static CPtrArray m_HookHandle; };  class A : public CHookCallback{public:    A();     virtual void HookCallback(int idHook, int code, WPARAM wParam, LPARAM lParam);};  class B : public CHookCallback{public:    B();     virtual void HookCallback(int idHook, int code, WPARAM wParam, LPARAM lParam);};

CHookCallback. cpp

#include"CHookCallback.hpp"using namespace std; CPtrList CHookCallback::m_HookID[WH_MAX - WH_MIN + 1];CPtrArray CHookCallback::m_HookHandle; CHookCallback::CHookCallback(){    Reset();} CHookCallback::~CHookCallback(){    RemoveAllHooks();} void CHookCallback::RemoveHook(int idHook) //remove derived class from a specific hook type{    int idHook0 = idHook - WH_MIN;     if (m_HookID[idHook0].GetCount())    {        POSITION pos = m_HookID[idHook0].Find(this);        if (pos)        {            m_HookID[idHook0].RemoveAt(pos);            if (!m_HookID[idHook0].GetCount())                UnhookWindowsHookEx((HHOOK)m_HookHandle[idHook0]);        }    }} void CHookCallback::RemoveAllHooks() //remove derived class from all hooks type{    for (int i = 0; i < WH_MAX - WH_MIN + 1; i++)    {        RemoveHook(i + WH_MIN);    }} BOOL CHookCallback::AddHook(int idHook, HINSTANCE hmod, DWORD dwThreadId) //add derived class to a specific hook type callback{    m_HookHandle.SetSize(WH_MAX - WH_MIN + 1);     HOOKPROC proc = NULL;    switch (idHook)    {    case WH_MSGFILTER:        proc = hookMSGFILTER;        break;    case WH_JOURNALRECORhttps://www.gofarlic.com        proc = hookJOURNALRECORD;        break;    case WH_JOURNALPLAYBACK:        proc = hookJOURNALPLAYBACK;        break;    case WH_KEYBOARhttps://www.gofarlic.com        proc = hookKEYBOARD;        break;    case WH_KEYBOARD_LL:        proc = hookKEYBOARDLL;        break;    case WH_GETMESSAGE:        proc = hookGETMESSAGE;        break;    case WH_CALLWNDPROC:        proc = hookCALLWNDPROC;        break;    case WH_CBT:        proc = hookCBT;        break;    case WH_SYSMSGFILTER:        proc = hookSYSMSGFILTER;        break;    case WH_MOUSE:        proc = hookMOUSE;        break;    case WH_DEBUG:        proc = hookDEBUG;        break;    case WH_SHELL:        proc = hookSHELL;        break;    case WH_FOREGROUNDIDLE:        proc = hookFOREGROUNDIDLE;        break;    case WH_CALLWNDPROCRET:        proc = hookCALLWNDPROCRET;        break;    }    ASSERT(proc);      //idHook not handled    if (!proc)        return FALSE;     int idHook0 = idHook - WH_MIN;     if (!m_HookHandle[idHook0])    {        HHOOK hHook = SetWindowsHookEx(idHook, proc, hmod, dwThreadId);        if (!hHook)            return FALSE;         m_HookHandle[idHook0] = hHook;    }    POSITION pos = m_HookID[idHook0].Find(this);    ASSERT(pos == NULL);      //class already mapped in hook callback    if (!pos)        m_HookID[idHook0].AddTail(this);     return TRUE;} void CHookCallback::Reset(){    //注意:这里为了适用于NX对话框,每次对话框开启时将静态成员变量重置    CHookCallback::m_HookID->RemoveAll();    CHookCallback::m_HookHandle.RemoveAll();} LRESULT CALLBACK CHookCallback::hookMSGFILTER(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_MSGFILTER, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookJOURNALRECORD(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_JOURNALRECORD, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookJOURNALPLAYBACK(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_JOURNALPLAYBACK, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookKEYBOARD(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_KEYBOARD, code, wParam, lParam);} LRESULT CHookCallback::hookKEYBOARDLL(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_KEYBOARD_LL, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookGETMESSAGE(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_GETMESSAGE, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookCALLWNDPROC(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_CALLWNDPROC, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookCBT(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_CBT, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookSYSMSGFILTER(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_SYSMSGFILTER, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookMOUSE(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_MOUSE, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookDEBUG(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_DEBUG, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookSHELL(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_SHELL, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookFOREGROUNDIDLE(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_FOREGROUNDIDLE, code, wParam, lParam);} LRESULT CALLBACK CHookCallback::hookCALLWNDPROCRET(int code, WPARAM wParam, LPARAM lParam){    return HookProc(WH_CALLWNDPROCRET, code, wParam, lParam);} LRESULT CHookCallback::HookProc(int idHook, int code, WPARAM wParam, LPARAM lParam){    int idHook0 = idHook - WH_MIN;     for (POSITION pos = m_HookID[idHook0].GetHeadPosition(); pos != NULL;)    {        CHookCallback *pCallback = (CHookCallback *)m_HookID[idHook0].GetNext(pos);        pCallback->HookCallback(idHook, code, wParam, lParam);    }     return CallNextHookEx((HHOOK)m_HookHandle[idHook0], code, wParam, lParam);} void CHookCallback::HookCallback(int idHook, int code, WPARAM wParam, LPARAM lParam){ } A::A(){    AddHook(WH_CALLWNDPROCRET);} void A::HookCallback(int idHook, int code, WPARAM wParam, LPARAM lParam){    ASSERT(idHook == WH_CALLWNDPROCRET);     if (code == HC_ACTION)    {        CWPRETSTRUCT* msg = (CWPRETSTRUCT*)(lParam);        TRACE("class A %p::HookCallback msg=%08lX WH_CALLWNDPROCRET\n", this, msg->message);    }}   B::B(){    AddHook(WH_GETMESSAGE);    AddHook(WH_CALLWNDPROCRET);} void B::HookCallback(int idHook, int code, WPARAM wParam, LPARAM lParam){    if (idHook == WH_CALLWNDPROCRET)    {        if (code == HC_ACTION)        {            CWPRETSTRUCT* msg = (CWPRETSTRUCT*)(lParam);            TRACE("class B %p::HookCallback msg=%08lX WH_CALLWNDPROCRET\n", this, msg->message);        }    }    else if (idHook == WH_GETMESSAGE)    {        if (code == HC_ACTION)        {            MSG* msg = (MSG*)(lParam);            TRACE("class B %p::HookCallback msg=%08lX WH_GETMESSAGE \n", this, msg->message);        }    }    else        ASSERT(FALSE);}

创建一个UI界面,如下:

设置的代码如下:

TestKeyboardCallbackForNxTreeBlk.hpp (NX UI)

#pragma once #include <uf_defs.h>#include <uf_ui_types.h>#include <uf_ui.h>#include <iostream>#include <NXOpen/Session.hxx>#include <NXOpen/UI.hxx>#include <NXOpen/NXMessageBox.hxx>#include <NXOpen/Callback.hxx>#include <NXOpen/NXException.hxx>#include <NXOpen/BlockStyler_UIBlock.hxx>#include <NXOpen/BlockStyler_BlockDialog.hxx>#include <NXOpen/BlockStyler_PropertyList.hxx>#include <NXOpen/BlockStyler_SelectObject.hxx>#include <NXOpen/BlockStyler_StringBlock.hxx>#include <NXOpen/BlockStyler_Tree.hxx>#include "CHookCallback.hpp"#undef CreateDialog using namespace std;using namespace NXOpen;using namespace NXOpen::BlockStyler;  class DllExport TestKeyboardCallbackForNxTreeBlk :public CHookCallback{    // class memberspublic:    static Session *theSession;    static UI *theUI;    static void Show_TestKeyboardForNxTreeBlk();    TestKeyboardCallbackForNxTreeBlk();    ~TestKeyboardCallbackForNxTreeBlk();    int Show();     //----------------------- BlockStyler Callback Prototypes ---------------------    // The following member function prototypes define the callbacks     // specified in your BlockStyler dialog. The empty implementation    // of these prototypes is provided in the hotKey.cpp file.     // You are REQUIRED to write the implementation for these functions.    //------------------------------------------------------------------------------    void initialize_cb();    void dialogShown_cb();    int ok_cb();    int update_cb(NXOpen::BlockStyler::UIBlock* block);    void focusNotify_cb(NXOpen::BlockStyler::UIBlock* block, bool focus);    void keyboardFocusNotify_cb(NXOpen::BlockStyler::UIBlock* block, bool focus);    PropertyList* GetBlockProperties(const char *blockID);     //user define func    Tree* GetTreeBlk();    StringBlock* GetStringBlk();     virtual void HookCallback(int idHook, int code, WPARAM wParam, LPARAM lParam);    static void UpdateTreeDataAfterDeleteOneRow(TestKeyboardCallbackForNxTreeBlk &obj);    static void UpdateStringBlock(TestKeyboardCallbackForNxTreeBlk &obj,int mouseType); private:    const char* theDlxFileName;    NXOpen::BlockStyler::BlockDialog* theDialog;    NXOpen::BlockStyler::SelectObject* selectObject;// Block type: Selection    NXOpen::BlockStyler::StringBlock* stringInput;// Block type: String    NXOpen::BlockStyler::Tree* treeDemo;// Block type: Tree Control};

TestKeyboardCallbackForNxTreeBlk.cpp

#include "TestKeyboardCallbackForNxTreeBlk.hpp"#include <sstream>#include <uf_ui.h>using namespace NXOpen;using namespace NXOpen::BlockStyler; namespace{    vector<Node*> GetAllNodes(Tree* tree)    {        Node *nd = tree->RootNode();         vector<Node*> res;        while (nd != NULL)        {            res.push_back(nd);             nd = nd->NextSiblingNode();        }         return res;    }     void ClearTree(Tree* tree)    {        vector<BlockStyler::Node*> nodes = GetAllNodes(tree);        for (int i = 0; i < nodes.size(); i++)        {            tree->DeleteNode(nodes[i]);        }    }     string IntToStr(int value)    {        std::ostringstream oss;        oss << value;        return oss.str();    }     void InitTreeBlk(Tree* &tree)    {        if (tree != NULL)        {            tree->InsertColumn(0, "", 100);        }    }     void InsertNodes(Tree* &tree, int nodeCount)    {        if (tree == NULL)        {            return;        }         std::string standName = "row";        for (int i = 0; i < nodeCount; ++i)        {            Node *node = tree->CreateNode(standName + IntToStr(i + 1));            tree->InsertNode(node, NULL, NULL, Tree::NodeInsertOptionLast);        }    }     bool GetFirstSelectedNodeLabel(Tree* tree, std::string &label)    {        if (tree == NULL)        {            return false;        }         bool res = false;        int columnCount = tree->NumberOfColumns();        vector<Node*> selectedNodes = GetAllNodes(tree);        for (int i = 0; i < selectedNodes.size(); ++i)        {            if (selectedNodes[i]->IsSelected())            {                if (columnCount >= 1)                {                    label = selectedNodes[i]->GetColumnDisplayText(0).GetLocaleText();                    res = true;                }                 break;            }        }         return res;    }     bool GetFirstSelectedNode(Tree* tree, Node* &node)    {        if (tree == NULL)        {            return false;        }         bool res = false;        int columnCount = tree->NumberOfColumns();        vector<Node*> selectedNodes = GetAllNodes(tree);        for (int i = 0; i < selectedNodes.size(); ++i)        {            if (selectedNodes[i]->IsSelected())            {                node = selectedNodes[i];                res = true;                break;            }        }         return res;    }     bool DeleteNode(Tree* tree, Node* node)    {        if (tree == NULL || node == NULL)        {            return false;        }         bool res = false;        vector<Node*> selectedNodes = GetAllNodes(tree);        for (int i = 0; i < selectedNodes.size(); ++i)        {            if (selectedNodes[i] == node)            {                tree->DeleteNode(node);                res = true;                break;            }        }         return res;    }} //------------------------------------------------------------------------------// Initialize static variables//------------------------------------------------------------------------------Session *(TestKeyboardCallbackForNxTreeBlk::theSession) = NULL;UI *(TestKeyboardCallbackForNxTreeBlk::theUI) = NULL; void TestKeyboardCallbackForNxTreeBlk::Show_TestKeyboardForNxTreeBlk(){    TestKeyboardCallbackForNxTreeBlk *thehotKey = NULL;    try    {        thehotKey = new TestKeyboardCallbackForNxTreeBlk();        // The following method shows the dialog immediately        thehotKey->Show();    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());    }    if (thehotKey != NULL)    {        delete thehotKey;        thehotKey = NULL;    } }//------------------------------------------------------------------------------// Constructor for NX Styler class//------------------------------------------------------------------------------TestKeyboardCallbackForNxTreeBlk::TestKeyboardCallbackForNxTreeBlk(){    try    {        // Initialize the NX Open C++ API environment        TestKeyboardCallbackForNxTreeBlk::theSession = NXOpen::Session::GetSession();        TestKeyboardCallbackForNxTreeBlk::theUI = UI::GetUI();        theDlxFileName = "TestKeyboardCallbackForNxTreeBlk.dlx";        theDialog = TestKeyboardCallbackForNxTreeBlk::theUI->CreateDialog(theDlxFileName);        // Registration of callback functions        theDialog->AddOkHandler(make_callback(this, &TestKeyboardCallbackForNxTreeBlk::ok_cb));        theDialog->AddUpdateHandler(make_callback(this, &TestKeyboardCallbackForNxTreeBlk::update_cb));        theDialog->AddInitializeHandler(make_callback(this, &TestKeyboardCallbackForNxTreeBlk::initialize_cb));        theDialog->AddFocusNotifyHandler(make_callback(this, &TestKeyboardCallbackForNxTreeBlk::focusNotify_cb));        theDialog->AddKeyboardFocusNotifyHandler(make_callback(this, &TestKeyboardCallbackForNxTreeBlk::keyboardFocusNotify_cb));        theDialog->AddDialogShownHandler(make_callback(this, &TestKeyboardCallbackForNxTreeBlk::dialogShown_cb));         AddHook(WH_KEYBOARD); //must add        AddHook(WH_MOUSE);    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        throw;    }} //------------------------------------------------------------------------------// Destructor for NX Styler class//------------------------------------------------------------------------------TestKeyboardCallbackForNxTreeBlk::~TestKeyboardCallbackForNxTreeBlk(){    if (theDialog != NULL)    {        delete theDialog;        theDialog = NULL;    }} int TestKeyboardCallbackForNxTreeBlk::Show(){    try    {        theDialog->Show();    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());    }    return 0;} //------------------------------------------------------------------------------//Callback Name: initialize_cb//------------------------------------------------------------------------------void TestKeyboardCallbackForNxTreeBlk::initialize_cb(){    try    {        selectObject = dynamic_cast<NXOpen::BlockStyler::SelectObject*>(theDialog->TopBlock()->FindBlock("selectObject"));        stringInput = dynamic_cast<NXOpen::BlockStyler::StringBlock*>(theDialog->TopBlock()->FindBlock("stringInput"));        treeDemo = dynamic_cast<NXOpen::BlockStyler::Tree*>(theDialog->TopBlock()->FindBlock("treeDemo"));    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());    }} //------------------------------------------------------------------------------//Callback Name: dialogShown_cb//This callback is executed just before the dialog launch. Thus any value set //here will take precedence and dialog will be launched showing that value. //------------------------------------------------------------------------------void TestKeyboardCallbackForNxTreeBlk::dialogShown_cb(){    try    {        //---- Enter your callback code here -----        InitTreeBlk(treeDemo);        InsertNodes(treeDemo, 10);    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());    }} //------------------------------------------------------------------------------//Callback Name: update_cb//------------------------------------------------------------------------------int TestKeyboardCallbackForNxTreeBlk::update_cb(NXOpen::BlockStyler::UIBlock* block){    try    {        if (block == selectObject)        {            //---------Enter your code here-----------        }        else if (block == stringInput)        {            //---------Enter your code here-----------        }    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());    }    return 0;} //------------------------------------------------------------------------------//Callback Name: ok_cb//------------------------------------------------------------------------------int TestKeyboardCallbackForNxTreeBlk::ok_cb(){    int errorCode = 0;    try    {    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        errorCode = 1;        TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());    }    return errorCode;} //------------------------------------------------------------------------------//Callback Name: focusNotify_cb//This callback is executed when any block (except the ones which receive keyboard entry such as Integer block) receives focus.//This callback is invoked when the block is in focus. This callback is used only for blocks that do not allow keyboard entries: //for example, Selection blocks.//当该块成为焦点时——UI上被点击,将调用此回调。 此回调仅用于不允许键盘输入的块:例如,选择块。//------------------------------------------------------------------------------void TestKeyboardCallbackForNxTreeBlk::focusNotify_cb(NXOpen::BlockStyler::UIBlock* block, bool focus){    try    {        if (block == selectObject)        {            //do something        }    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());    }} //------------------------------------------------------------------------------//Callback Name: keyboardFocusNotify_cb//This callback is executed when block which can receive keyboard entry, receives the focus.//当块获得焦点时——UI上被点击,将调用此回调。 此回调仅用于允许键盘输入的块:例如,Integer或Double块。//------------------------------------------------------------------------------void TestKeyboardCallbackForNxTreeBlk::keyboardFocusNotify_cb(NXOpen::BlockStyler::UIBlock* block, bool focus){    try    {        //---- Enter your callback code here -----        if (block == stringInput)  //只能指向可被键盘输入的 BLOCK        {         }    }    catch (exception& ex)    {        //---- Enter your exception handling code here -----        TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());    }} //------------------------------------------------------------------------------//Function Name: GetBlockProperties//Description: Returns the propertylist of the specified BlockID//------------------------------------------------------------------------------PropertyList* TestKeyboardCallbackForNxTreeBlk::GetBlockProperties(const char *blockID){    return theDialog->GetBlockProperties(blockID);} Tree * TestKeyboardCallbackForNxTreeBlk::GetTreeBlk(){    return treeDemo;} StringBlock * TestKeyboardCallbackForNxTreeBlk::GetStringBlk(){    return stringInput;} void TestKeyboardCallbackForNxTreeBlk::HookCallback(int idHook, int nCode, WPARAM wParam, LPARAM lParam){    if (idHook == WH_KEYBOARD)    {        if (nCode == HC_ACTION)        {            if (wParam == VK_DELETE)            {                UpdateTreeDataAfterDeleteOneRow(*this);            }            else if (wParam == 'H')            {                TestKeyboardCallbackForNxTreeBlk::theUI->NXMessageBox()->Show("键盘事件", NXOpen::NXMessageBox::DialogTypeError, "按下H");            }        }    }    else if (idHook == WH_MOUSE)    {        if (nCode == HC_ACTION)        {                        if (wParam == WM_MOUSEMOVE) //鼠标滚动            {                UpdateStringBlock(*this, 1);            }            else if (wParam == WM_LBUTTONDOWN) //左键按下            {                UpdateStringBlock(*this, 2);            }        }    } } void TestKeyboardCallbackForNxTreeBlk::UpdateTreeDataAfterDeleteOneRow(TestKeyboardCallbackForNxTreeBlk &obj){    Tree* treeBlk = obj.GetTreeBlk();    if (treeBlk != NULL)    {        Node* selectedNode = NULL;        if (GetFirstSelectedNode(treeBlk, selectedNode))        {            DeleteNode(treeBlk, selectedNode);        }    }} std::string GetTimeString(){    time_t timer;    struct tm* tm_info;    time(&timer);    tm_info = localtime(&timer);     char buffer[133];    //strftime(buffer, 133, "%Y:%m:%d-%H:%M:%S", tm_info);    strftime(buffer, 133, "%H:%M:%S", tm_info);     return string(buffer);} void TestKeyboardCallbackForNxTreeBlk::UpdateStringBlock(TestKeyboardCallbackForNxTreeBlk & obj,int mouseType){    StringBlock* stringBlk = obj.GetStringBlk();    if (stringBlk != NULL)    {        if (mouseType == 1)        {            std::string time = GetTimeString();            stringBlk->SetValue(time);        }        else if (mouseType == 2)        {            stringBlk->SetValue("鼠标左键按下");        }     }}


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空