【发布时间】:2014-03-08 16:21:30
【问题描述】:
所以我一直在拼命地尝试自动化拖放功能,并将我的解决方案搜索范围缩小到一段相当精致的代码:
// DragAndDrop.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <Shlobj.h>
#include <tchar.h>
int main(int argc, char* argv[]) {
for (int i = 0; i <= WM_DROPFILES; i++)
{
ChangeWindowMessageFilter (i, MSGFLT_ADD);
}
if (HWND hwnd = FindWindow ("OpusApp", NULL)) {
//HGLOBAL hGlobal = GlobalAlloc (GMEM_FIXED,
//sizeof ("d:\\DragMe.txt") + 2);
//char *strFile = (char*) GlobalLock
//(hGlobal);
//strcpy (strFile, "d:\\DragMe.txt");
//strFile [strlen ("d:\\DragMe.txt") +
//1] = NULL;
char filename[] = "d:\\DragMe.txt";
POINT point;
point.x = 480;
point.y = 480;
HGLOBAL hMem = GlobalAlloc(GHND, sizeof(DROPFILES) + strlen(filename)+2);
DROPFILES *dfiles = (DROPFILES*) GlobalLock(hMem);
if (!dfiles)
{
GlobalFree(hMem);
return NULL;
}
dfiles->pFiles = sizeof(DROPFILES);
dfiles->pt = point;
dfiles->fNC = TRUE;
dfiles->fWide = FALSE;
memcpy(&dfiles[1], filename, strlen(filename));
GlobalUnlock(hMem);
printf ("Sending Message...\n");
if (!PostMessage(hwnd, WM_DROPFILES, (WPARAM)hMem, 0)) {
printf("Error Posting Message!");
GlobalFree(hMem);
}
}
int temp = 0;
scanf("&d", temp);
return 0;
}
...对于我的代码中的任何不好的词,我深表歉意...它们仅用于调试目的。无论如何,以上内容非常简单,它适用于 Microsoft Word、Excel 和记事本......但对于许多应用程序它根本不起作用(Spy++ 甚至不记录 WM_DROPFILES 消息系统范围 在这些情况下,这很奇怪......)。我什至尝试将问题应用程序的代码编译为 x64 或 x86,但没有任何变化...
我觉得我可能错误地使用了 FindWindow(我正在使用与 AutoIT 捆绑的窗口信息工具来获取窗口类,因为我发现 Spy++ 非常混乱)。无论如何,我设置了一个赏金,因为我真的需要弄清楚这一点。
我需要使用它的应用程序名为 Dartfish,它是 Windows 7 上的 32 位应用程序...我需要将视频文件列表发送到其界面的特定区域(特定窗格) ,我正在尝试用上面的代码来做到这一点。
有什么帮助吗?非常感谢!!
【问题讨论】:
-
你的目标窗口有 WS_EX_ACCEPTFILES 样式吗?
-
看,这就是问题所在……它是第三方的闭源应用程序。我不知道。所以完全有可能我可能会叫错树,并且应用程序甚至可能没有 WM_DROPFILES 的事件处理程序?还是所有 Windows 应用程序都默认处理此消息?
-
要检测 WS_EX_ACCEPTFILES 样式,您可以使用 GetWindowLong 和 GWL_EXSTYLE 参数。
-
WS_EX_ACCEPTFILES只是避免调用DragAcceptFiles()的捷径。但是不,所有应用程序默认不处理WM_DROPFILES,DefWindowProc()丢弃它。各个应用程序必须处理WM_DROPFILES来决定它们要如何使用拖动的文件名。 -
好的,感谢您解决这个问题。见下文;我一直在研究您的解决方案。
标签: c++ winapi drag-and-drop automation windows-messages