NX二次开发-通过获取窗口句柄方式来设置类型过滤器EnumChildWindows

Posted 阿飞的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NX二次开发-通过获取窗口句柄方式来设置类型过滤器EnumChildWindows相关的知识,希望对你有一定的参考价值。

  • 版本

NX9+VS2012

 

  • 说明

我们可以通过获得NX的父项窗口句柄来遍历下面的子项窗口句柄。

然后对每个句柄单独发送消息,来执行操作。

获得NX窗口句柄用这个函数UF_UI_get_default_parent()

遍历子窗口用这个函数EnumChildWindows

 

下面的这个例子是遍历类型过滤器句柄,然后模拟鼠标点击,选择下拉类型。

但是这个例子还不够完善,还有很多问题,后续在花点时间不断完善。

本来想得到句柄后,直接用SetWindowText去设置过滤器当前显示的内容,结果还不行。不起作用。

后来又想用SendMessage发送消息,设置显示内容WM_SETTEXT,还是不行,设置下拉枚举第几个也不行。

几种方法试了都不行,才选择了用鼠标模拟点击去做的。

相关参考资料

SendMessage和遍历窗口句柄相关资料

https://bbs.csdn.net/topics/280063280
https://blog.csdn.net/yue7603835/article/details/7606820
https://baike.baidu.com/item/SetWindowText/6376883?fr=aladdin
https://ask.zol.com.cn/x/3346728.html
https://blog.csdn.net/Kelvin_Yan/article/details/41082525
https://ask.csdn.net/questions/219308

鼠标模拟点击相关资料

https://www.cnblogs.com/yyx001000000001010101100101/p/4556375.html

https://blog.csdn.net/AiFengipeng/article/details/112758075

  • 源代码
NX9+VS2012

//NX9_NXOpenCPP_Wizard14

// Mandatory UF Includes

#include <uf.h>
#include <uf_object_types.h>

// Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx>

// Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx>

//头文件
#include <uf.h>
#include <uf_ui.h>
#include <atlstr.h>

// Std C++ Includes
#include <iostream>
#include <sstream>



using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr;


//------------------------------------------------------------------------------
// NXOpen c++ test class 
//------------------------------------------------------------------------------
class MyClass
{
    // class members
public:
    static Session *theSession;
    static UI *theUI;

    MyClass();
    ~MyClass();

    void do_it();
    void print(const NXString &);
    void print(const string &);
    void print(const char*);

private:
    Part *workPart, *displayPart;
    NXMessageBox *mb;
    ListingWindow *lw;
    LogFile *lf;
};

//------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL;

//------------------------------------------------------------------------------
// Constructor 
//------------------------------------------------------------------------------
MyClass::MyClass()
{

    // Initialize the NX Open C++ API environment
    MyClass::theSession = NXOpen::Session::GetSession();
    MyClass::theUI = UI::GetUI();
    mb = theUI->NXMessageBox();
    lw = theSession->ListingWindow();
    lf = theSession->LogFile();

    workPart = theSession->Parts()->Work();
    displayPart = theSession->Parts()->Display();
    
}

//------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
}

//------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}



//枚举子窗口回调函数原型
static int child_num; static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)//回调函数 { if (hwnd) //如果子窗口存在 { child_num++;//记录子窗口的数目 LPTSTR child_buffer_1 = new char[255];//子窗口的标题名称 LPTSTR child_buffer_2 = new char[255];//子窗口的类名 GetWindowText(hwnd, child_buffer_1, 255);//则开始获取窗口的标题 GetClassName(hwnd, child_buffer_2, 255);//则开始获取窗口的类名 //char msg[500]; //sprintf(msg, "子窗口的标题名称:%s,子窗口的类名%s\\n", child_buffer_1, child_buffer_2); //UF_UI_write_listing_window(msg); if (strcmp(child_buffer_1, "No Selection Filter") == 0)//判断子窗口标题名称 { //保存当前鼠标指针 //取得当前鼠标位置 POINT p;//x,y GetCursorPos(&p); //开始移动鼠标模拟点击 //移动到过滤器位置处 RECT rect; GetWindowRect(hwnd, &rect); SetCursorPos(rect.left + 30, rect.top + 10); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //设置点击下拉内容 SetCursorPos(rect.left + 30, rect.top + 50);//计算鼠标位置 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //还原鼠标位置 SetCursorPos(p.x,p.y); } } return TRUE; } //------------------------------------------------------------------------------ // Do something //------------------------------------------------------------------------------ void MyClass::do_it() { // TODO: add your code here UF_initialize(); //UF_UI_open_listing_window(); HWND UGHwnd = (HWND)UF_UI_get_default_parent();//获取UG窗口句柄 LPTSTR child_buffer_1 = new char[255];//父窗口的标题名称 LPTSTR child_buffer_2 = new char[255];//父窗口的类名 GetWindowText(UGHwnd, child_buffer_1, 255);//则开始获取窗口的标题 GetClassName(UGHwnd, child_buffer_2, 255);//则开始获取窗口的类名 SetWindowText(UGHwnd, "SB"); //char msg[500]; //sprintf(msg, "父窗口的标题名称:%s,父窗口的类名%s\\n", child_buffer_1, child_buffer_2); //UF_UI_write_listing_window(msg); EnumChildWindows(UGHwnd, (WNDENUMPROC)EnumChildProc, (LPARAM)NULL); //枚举子窗口 UF_terminate(); } //------------------------------------------------------------------------------ // Entry point(s) for unmanaged internal NXOpen C/C++ programs //------------------------------------------------------------------------------ // Explicit Execution extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen ) { try { // Create NXOpen C++ class instance MyClass *theMyClass; theMyClass = new MyClass(); theMyClass->do_it(); delete theMyClass; } catch (const NXException& e1) { UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message()); } catch (const exception& e2) { UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what()); } catch (...) { UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception."); } } //------------------------------------------------------------------------------ // Unload Handler //------------------------------------------------------------------------------ extern "C" DllExport int ufusr_ask_unload() { return (int)NXOpen::Session::LibraryUnloadOptionImmediately; } 阿飞 2021年9月6日

演示

打印所有子窗口句柄

 

阿飞

2021年9月6日

 

以上是关于NX二次开发-通过获取窗口句柄方式来设置类型过滤器EnumChildWindows的主要内容,如果未能解决你的问题,请参考以下文章

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

nx二次开发怎么判断选择的曲线是不是有缝隙

UG NX二次开发(C#)--建模--识别曲面类型(圆柱面)

UG NX二次开发(C#)--建模--识别曲面类型(圆柱面)

UG NX二次开发(C#)-UIStyler-创建长方体

UG NX二次开发(C#)-曲线-NXOpen.Curve初探