得到其它软件窗体的标题和类名
现在我们要得到激活程序的标题
这个当然可以用spy,但是如果每次都用那个东西应该挺麻烦,干脆我自己做一个功能来随时得到其它软件的标题,这样会方便得多。我想要的结果如下:
1、界面搞成如下情况:timer1间隔弄成5000,也就是5秒钟运行一次
2、代码功能为:点击按钮,timer1开始收集用户鼠标所在位置的软件窗体的名称和类等附带信息,再点一次,timer1停止收集这些信息。
这里我贴出所有代码usingSystem;usingSystem。Diagnostics;usingSystem。Drawing;usingSystem。IO;usingSystem。Runtime。InteropServices;usingSystem。Text;usingSystem。Threading;usingSystem。Windows。Forms;namespacejhwin{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}〔DllImport(user32。dll,EntryPointFindWindow)〕privateexternstaticIntPtrFindWindow(stringlpClassName,stringlpWindowName);引用API,这里多引用了得到类名称的API,反正也是闲着根据坐标得到指定位置句柄〔DllImport(user32)〕privatestaticexternIntPtrWindowFromPoint(PointPoint坐标);得到窗体名称〔DllImport(user32,SetLastErrortrue)〕publicstaticexternintGetWindowText(IntPtrhWnd,窗口句柄StringBuilderlpString,标题intnMaxCount最大值);获取类的名字〔DllImport(user32。dll)〕privatestaticexternintGetClassName(IntPtrhWnd,句柄StringBuilderlpString,类名intnMaxCount最大值);privatevoidForm1Load(objectsender,EventArgse){label2。Text等待激活软件运行。。。;CheckForIllegalCrossThreadCallsfalse;ThreadtnewThread(RunJHexe);t。IsBackgroundtrue;t。Start();}运行激活程序voidRunJHexe(){临时文件夹位置vartempPathPath。Combine(Path。GetTempPath(),win10jh。exe);将文件写到临时文件夹位置File。WriteAllBytes(tempPath,Resource1。win10jh);建立文件信息varinfonewProcessStartInfo(tempPath);这里选false的话,需要提升本调试程序权限info。UseShellExecutetrue;启动程序Process。Start(info);观察win10jh。exe是否已经运行了。FindJHWin();}voidFindJHWin(){boolOK;OKfalse;while(!OK){主窗口标题为win10jh。exeIntPtrstartwinFindWindow(null,win10jh。exe);if(startwin!IntPtr。Zero){label2。Text已运行!;OKtrue;}}}上面是上次的内容点击按钮,控制timerprivatevoidbutton1Click(objectsender,EventArgse){if(!timer1。Enabled){timer1。Enabledtrue;timer1。Start();}else{timer1。Enabledfalse;timer1。Stop();}}得到标题privatevoidtimer1Tick(objectsender,EventArgse){GetTitle();}得到鼠标位置软件标题voidGetTitle(){鼠标位置intxCursor。Position。X;intyCursor。Position。Y;PointpnewPoint(x,y);得到鼠标位窗口句柄IntPtrformHandleWindowFromPoint(p);根据句柄得到窗口的标题StringBuildertitlenewStringBuilder(256);GetWindowText(formHandle,title,title。Capacity);根据句柄得到窗口的类名,这个有时会用到,本次没有用到StringBuilderclassNamenewStringBuilder(256);GetClassName(formHandle,className,className。Capacity);得到窗口的句柄标题this。textBox1。Texttitle。ToString()r;类名this。textBox1。TextclassName。ToString()r;;}}}运行结果如下: