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

标签 c++ winapi drag-and-drop console-application

首先,澄清一下,我不是询问如何将文件拖放到 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/

相关文章:

c++ - 事件系统 : Inheritance with type-casting or unions

c++ - Ubuntu 的 SDL2.0.2 安装中缺少对象

c++ - Win32 控制台禁用系统菜单按钮

windows - 挂起一个线程比让它等待有什么好处吗?

winapi - 如何确定事件键盘布局的名称?

java Jbutton图标, move 没问题,但是当我取消 move 时,源按钮的图标变为空白

c++ - 如何在C++中编写通用对象池

c++ - 帮忙解决这个问题吗?

wpf - 如何在拖动 Thumb 时捕获 MouseEnter?

javascript - 使用 interact.js 拖放