V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yangguoshuai
V2EX  ›  问与答

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

  •  
  •   yangguoshuai · 2018-07-12 10:24:28 +08:00 · 1199 次点击
    这是一个创建于 2325 天前的主题,其中的信息可能已经有所发展或是发生改变。

    书接前文。

    我决定还是用按键精灵 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 的用法是啥?

    6 条回复    2018-07-13 13:38:35 +08:00
    Rheinmetal
        1
    Rheinmetal  
       2018-07-12 14:01:29 +08:00
    ahk 不能实现?
    非要用 bv
    win32 用 c
    yangguoshuai
        2
    yangguoshuai  
    OP
       2018-07-12 21:34:29 +08:00 via Android
    @Rheinmetal 久闻 ahk 大名。
    想知道 ahk 支持操作 listbox 之类的么
    而且我还依赖很多外部输入,比如每次的账号密码都不一样
    Rheinmetal
        4
    Rheinmetal  
       2018-07-13 08:59:08 +08:00   ❤️ 1
    yangguoshuai
        5
    yangguoshuai  
    OP
       2018-07-13 10:57:29 +08:00
    @Rheinmetal 感谢。。伸手党再多问一句,ahk 支持生成独立的支持参数外部调用的程序吗。。。
    Rheinmetal
        6
    Rheinmetal  
       2018-07-13 13:38:35 +08:00
    可以编译成 exe
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4611 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 09:52 · PVG 17:52 · LAX 01:52 · JFK 04:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.