为何使用CStr(IIf(...))作为参数调用FindWindowEx API无效?
问题原因解析
核心差异在于**vbNullString的特殊处理和IIf函数的返回类型特性**:
vbNullString是VBA中专门用来对应C语言NULL字符串指针的特殊值。当直接传递vbNullString(或CStr(vbNullString),因为vbNullString本身就是String类型,转换后仍保持其特殊标识)给FindWindowExA的lpsz2参数时,VBA会将其转换为NULL指针,这符合API的规则:当该参数为NULL时,匹配任意标题的窗口。IIf函数的返回值是Variant类型,哪怕它返回的内容是vbNullString,也会被包裹在Variant容器中。用CStr转换这个Variant后,得到的是一个普通空字符串(仅长度为0,但丢失了vbNullString的特殊标识)。此时VBA传递给API的不是NULL指针,而是指向一个仅含终止符\0的空字符串缓冲区的指针。
FindWindowExA接收到这个空字符串指针后,会判定你要匹配标题为空的窗口,而非任意标题的窗口,因此找不到目标Excel窗口(Excel窗口标题不为空)。
内容的提问来源于stack exchange,提问作者6diegodiego9
相关产品推荐
相关产品推荐

