书接前文。
我决定还是用按键精灵 like 的方式处理一个第三方 win32 程序的自动提交了。
所以我开启了一个新的 vb.net 工程。
一个 form。
一个方形的 form。
拉了一个方形的按钮。
双击这个按钮。
睿智的编辑器自动给我生成了 button on click handler。
到现在,一切还很美好。
然后呢。
我需要一个 api。
一个 user32 的 api。
一个用的不能再熟悉的 FindWindowEx 的函数。
定义是什么鬼来着?
Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
甩进去
找到一个 dialog,美滋滋
继续找 dialog 里面的 Edit
Dim idEdit& = FindWindowEx(dialogHwnd, 0&, "Edit", vbNullStr)
执行
进程卡死
杀掉 vs.net ,如故。
反复实验几次,总算偶然一次出了一个报错提示:
blah blah 托管类型不一致 blah blah
哦哦,api 声明错了吧,hhhh
dotNet 版本的是这么写:
Private Declare Function FindWindowEx Lib "user32" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
这特么的都是魔法么?
msdn 上去哪找这么多魔法的定义?
好,继续,我们输入文本。
输入文本?需要一个消息,需要 send 一个WM_SETTEXT
给对应的 hwnd
可是
WM_SETTEXT
又等于啥?
好,放狗找:
private CONST WM_SETTEXT= &HC
奈斯
然后操作 ListBox 嗯,这东西用的人少,demo 代码也比较少,我们找下文档
都在这呢哈,真香。 可是,每一个常量的值都是啥? 文档里面说得好好的,去 winuser.h 看吧 放狗找了下: winuser.h
/*
* Listbox messages
*/
#define LB_ADDSTRING 0x0180
#define LB_INSERTSTRING 0x0181
#define LB_DELETESTRING 0x0182
#define LB_SELITEMRANGEEX 0x0183
#define LB_RESETCONTENT 0x0184
#define LB_SETSEL 0x0185
#define LB_SETCURSEL 0x0186
#define LB_GETSEL 0x0187
意思是,让我把这些消息常量都转成 vb 的语法贴进去吗?
还有一些不那么反人类的用法吗??
所以……实现这点需求的正确的 vb.net 的用法是啥?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.