我在Delphi 10.1中遇到以下代码的问题:
ShellExecute(handle,'open',PChar(filename), '','',SW_SHOWNORMAL);
当我尝试运行代码时,它会给我这个错误:
不兼容的类型:'HWND'和'TWindowHandle'
答案 0 :(得分:4)
在FireMonkey中,表单的Handle
属性类型为TWindowHandle
(在FMX.Types单元中定义的类)。在Windows上,它实现为TWinWindowHandle
(FMX.Platform.Win单元中定义的TWindowHandle
的子类)。
TWinWindowHandle
将HWND
句柄存储在其Wnd
属性中。
要获得实际的HWND
句柄,您需要使用FmxHandleToHWND()
:
ShellExecute(FmxHandleToHWND(Handle), 'open', PChar(filename), '', '', SW_SHOWNORMAL);
这会将TWindowHandle
转换为TWinWindowHandle
(使用WindowHandleToPlatform
),然后返回其Wnd
属性值。
已更新(根据Remy的评论):
Remy指出,FmxHandleToHWND
被记录为不推荐使用(从XE4开始)。这似乎没有被最新的源代码备份,在Delphi 10.1柏林RTM版本的情况下似乎已经删除了通常的deprecated
修饰符,但让我们为了安全起见文档的话
而不是FmxHandleToHWND
我们建议您完全按照FmxHandleToHWND
执行操作,即调用WindowHandleToPlatform
并访问Wnd
属性,因此:
ShellExecute(WindowHandleToPlatform(Handle).Wnd, 'open', PChar(filename), '', '', SW_SHOWNORMAL);
更好的选择是使用FormToHWND
,这比FmxHandleToHWND
更直接替代WindowHandleToPlatform
(我们可以想知道为什么文档没有指出我们在这个例程中,虽然可能的答案是文档作者错了):
ShellExecute(FormToHWND(Handle), 'open', PChar(filename), '', '', SW_SHOWNORMAL);
答案 1 :(得分:1)
TWindowHandle
是FireMonkey类。 HWND
是Windows句柄。这些是完全不同的类型。
对于VCL,可以将TForm.Handle
之类的HWND
传递给ShellExecute()
。对于FireMonkey(FMX),它不是,因为它是TWindowHandle
。
使用单位GetDesktopWindow()
中的Winapi.Windows
代替:
ShellExecute(GetDesktopWindow, 'open', PChar(filename), '', '', SW_SHOWNORMAL);