gpt4 book ai didi

c++ - 使用 C++ 和 WinAPI 将 WM_DROPFILES 发送到第三方应用程序

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:43 25 4
gpt4 key购买 nike

所以我一直在拼命地尝试自动化拖放功能,并将我对解决方案的搜索范围缩小到相当精炼的代码块:

// 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 消息system-wide 在这些情况下,这很奇怪......)。我什至尝试过将问题应用程序的代码编译为 x64 或 x86,但没有任何改变...

我觉得我可能错误地使用了 FindWindow(我正在使用与 AutoIT 捆绑在一起的窗口信息工具来获取窗口类,因为我发现 Spy++ 非常令人困惑)。无论如何,我正在设置赏金,因为我真的很需要解决这个问题。

我需要使用它的应用程序名为 Dartfish,它是 Windows 7 上的 32 位应用程序...我需要将视频文件列表发送到其界面的特定区域(特定 Pane ) ,我正在尝试使用上面的代码执行此操作。

有什么帮助吗?非常感谢!!

最佳答案

ChangeWindowMessageFilter/Ex() 不授予您向其他进程发送指定消息的权利。它授予其他进程(特别是完整性较低的进程)将消息发送给您的权利。所以摆脱它,它对你没有好处。

接下来,尝试发送 dfiles->fWide 设置为 TRUE 的 Unicode 文件名,看看它是否有所不同。一些应用程序不处理 Ansi 数据。 Windows 是基于 Unicode 的操作系统。使用 IsWindowUnicode()了解给定的 HWND 是否需要 Ansi 或 Unicode 窗口消息。

最后,一些应用根本没有实现 WM_DROPFILES(它们不调用 DragAcceptFiles() 或启用 WS_EX_ACCEPTFILES)。在现代 Windows 版本中处理拖放的首选方法是实现 IDropTarget接口(interface),并使用 RegisterDragDrop() 将其与 HWND 相关联.没有用于检索 HWND 的 IDropTarget 的 API,但可以手动完成:

(改编自此讨论:How to receive for HWND it IDropTarget?)

IDropTarget* GetRegisteredDropTargetFromWnd (HWND hWnd) 
{
IUnknown *pBuffer = (IUnknown *) GetProp (hWnd, TEXT("OleDropTargetInterface"));
if (pBuffer != NULL)
{
IDropTarget *pRetVal = NULL;
if (SUCCEEDED(pBuffer->QueryInterface(IID_IDropTarget, (void **) &pRetVal)))
return pRetVal;
}
return NULL;
}

如果 HWND 有一个 IDropTarget,您可以用一个 IDataObject 包装您的 DROPFILES 数据并将其传递给 IDropTarget: :Drop() 方法。如果 Drop() 接受数据,则不要发布 WM_DROPFILES 消息。然而,诀窍在于 GetProp() 返回的 IDropTarget* 指针与拥有 HWND 的进程相关,因此您必须将其编码到您的进程中,或者将您的代码注入(inject) HWND 的进程,以便实际使用接口(interface)指针。

关于c++ - 使用 C++ 和 WinAPI 将 WM_DROPFILES 发送到第三方应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22271857/

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