gpt4 book ai didi

c++ - 在运行的 Windows 控制台应用程序中处理拖放文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:17 34 4
gpt4 key购买 nike

首先,澄清一下,我不是询问如何将文件拖放到 exe 的图标上。我想知道如何处理拖放到已运行 win32 控制台应用程序的操作。我也 询问如何通过 Windows 消息泵处理基于 WinMain 的应用程序内部的拖放。我想在一个程序内部执行此操作,该程序的入口点 int main() 还没有 WndProc(还)或任何东西。

也就是说,我想知道我的目标是否可以实现(并希望它可以实现)。

我有一个在控制台窗口中运行的服务器应用程序。由于庞大的代码库和许多奇怪的耦合,它是一个用于所有密集目的的“仅输出”控制台。不过,在其中,我仍然可以处理按键之类的事情,因为我有一个更新循环在滴答作响。我希望能够将充满命令(使用自定义语法)的文件拖放到我正在运行的应用程序中并让它处理它们。

这可能吗?我当时在想,我可能会得到一个指向控制台 HWND 的指针(希望这是一个东西?),然后可能将该窗口子类化以使用自定义 WndProc 来监听 WM_DROPFILES 消息。

我从来没有真正尝试过在 int main() 程序而不是 WinMain 程序中设置 Windows 消息的处理,但我希望它以某种方式可能。

任何帮助将不胜感激!奇怪的解决方案很好。

最佳答案

据我所知,控制台窗口默认不支持拖放。您始终可以使用自己的消息循环创建自己的独立弹出窗口,以便用户可以将项目拖到上面。

要在控制台窗口本身上使用拖放,请尝试使用 GetConsoleWindow()获取控制台 HWND,然后:

  1. 使用 SetWindowLong/Ptr() 对 HWND 进行子类化或 SetWindowSubClass() ,然后使用 DragAcceptFiles() 注册 HWND开始接收 WM_DROPFILES 消息。请务必再次调用 DragAcceptFiles() 以停止接收消息,然后在退出应用程序之前取消 Hook 您的子类。

  2. 实现IDropTarget接口(interface),然后使用 RegisterDragDrop() 注册 HWND开始接收通知。务必调用RevokeDragDrop()在退出应用之前。

WM_DROPFILES 更容易编写代码,但 IDropTarget 更灵活,因为它可以处理虚拟项目和物理文件。

关于c++ - 在运行的 Windows 控制台应用程序中处理拖放文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21345232/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com