请问使用 VB.NET 进行 win32 编程的正确姿势? API 声明?常量表导入?

2018-07-12 10:24:28 +08:00
 yangguoshuai

书接前文。

我决定还是用按键精灵 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 代码也比较少,我们找下文档

listBox msgs

都在这呢哈,真香。 可是,每一个常量的值都是啥? 文档里面说得好好的,去 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 的用法是啥?

1199 次点击
所在节点    问与答
6 条回复
Rheinmetal
2018-07-12 14:01:29 +08:00
ahk 不能实现?
非要用 bv
win32 用 c
yangguoshuai
2018-07-12 21:34:29 +08:00
@Rheinmetal 久闻 ahk 大名。
想知道 ahk 支持操作 listbox 之类的么
而且我还依赖很多外部输入,比如每次的账号密码都不一样
Rheinmetal
2018-07-13 08:56:19 +08:00
Rheinmetal
2018-07-13 08:59:08 +08:00
yangguoshuai
2018-07-13 10:57:29 +08:00
@Rheinmetal 感谢。。伸手党再多问一句,ahk 支持生成独立的支持参数外部调用的程序吗。。。
Rheinmetal
2018-07-13 13:38:35 +08:00
可以编译成 exe

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/470113

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX