处理运行的Windows控制台应用程序中的拖放文件
Handling drag and drop files in a running Windows console application
首先,要澄清,我是询问如何将文件拖放到EXE的图标上。我想知道如何处理拖放到已经在运行 win32控制台应用程序的上。我也不是询问如何通过Windows消息泵处理基于Winmain的应用程序内部的拖放。我想在程序中使用没有wndproc(尚未)或其他任何内容的输入点 int main()内部执行此操作。
也就是说,我想知道我的目标是否可以实现(并希望它是)。
我有一个在控制台窗口内运行的服务器应用程序。由于大量的代码库和许多怪异的耦合,因此对于所有密集目的而言,它都是"仅输出"控制台。不过,在其中,我仍然可以处理诸如钥匙按钮之类的事情,因为我有一个更新循环滴答作响。我希望能够拖放装满命令的文件(使用自定义语法)到我的运行应用程序中并将其处理。
这可以做到吗?我当时认为我可能会得到一个指向控制台的HWND的指针(希望这是一回事?),然后也许该窗口使用自定义WNDProc来聆听WM_Dropfiles消息。
我从未真正尝试过在 int main()程序而不是 winmain 程序中设置Windows消息的处理,但是我希望它是某种程度上可能。
任何帮助将不胜感激!怪异的解决方案很好。
afaik,控制台窗口默认情况下不支持拖放。您可以随时使用其自己的消息循环创建自己的单独的弹出窗口,以便用户可以将项目拖到。
要使用拖动在控制台窗口上,请尝试使用GetConsoleWindow()
获取控制台HWND,然后使用:
使用
SetWindowLong/Ptr()
或SetWindowSubClass()
子类HWND,然后使用DragAcceptFiles()
注册HWND以开始接收WM_DROPFILES
消息。请务必再次致电DragAcceptFiles()
以停止接收消息,然后在退出应用程序之前解开子类。实现
IDropTarget
接口,然后使用RegisterDragDrop()
注册HWND以开始接收通知。在退出应用程序之前,请务必致电RevokeDragDrop()
。
WM_DROPFILES
更容易编码,但是IDropTarget
处理虚拟项目和物理文件时更加灵活。
#include <vector>
#include <string>
#include <iostream>
#include <conio.h>
int main()
{
std::cout << "Please drop files and press [Enter] when done ...n";
std::vector< std::string > files;
for( int ch = _getch(); ch != 'r'; ch = _getch() ) {
std::string file_name;
if( ch == '"' ) { // path containing spaces. read til next '"' ...
while( ( ch = _getch() ) != '"' )
file_name += ch;
} else { // path not containing spaces. read as long as chars are coming rapidly.
file_name += ch;
while( _kbhit() )
file_name += _getch();
}
files.push_back( file_name );
}
std::cout << "You dropped these files:n";
for( auto & i : files )
std::cout << i << 'n';
}
- 试图在visual studio上用C++创建一个桌面应用程序
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 如何将控制台应用程序放入系统托盘通知C++?
- 如何在 2 个应用程序之间实现拖放?
- 在MFC应用程序中缩放RDP ActiveX较大
- 应用程序如何检测缩放和监视Windows 10上的布局更改
- 将文件拖放到 Qt5 应用程序外部
- 如何在QML无窗口应用程序中设置拖放区域
- 将多个图像从QT应用程序拖到MS Word
- 处理运行的Windows控制台应用程序中的拖放文件
- 将单元格从 QTableView 拖动到外部应用程序
- 如何使用 Clion将断点放入链接到静态库的应用程序中
- 如果在应用程序外部取消拖动
- 如何制作块生成器拖放布局程序
- 需要解决哪个类以支持Qt应用程序和查找器之间的拖放
- 将应用程序外部的文件拖放到QTableView中
- 选择从Windows将文件拖放到GLFW应用程序中
- 在Windows通用应用程序上拖放文件
- X11窗口不放入QWidget以嵌入到Qt应用程序中
- 拖放Qt:知道目标应用程序悬停-是可能的