- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我一直在拼命地尝试自动化拖放功能,并将我对解决方案的搜索范围缩小到相当精炼的代码块:
// 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/
我正在使用 Embarcadero RAD Studio XE 来开发应用程序。我正在尝试使用以下代码将文件拖放到应用程序 TMainForm = class(TForm) public: pro
我必须分配一些内存来为此消息上的 WPARAM 创建一个奇怪的结构,但是在调用 PostMessage 后,我无法释放内存,除非程序崩溃,并提示存在堆损坏。 void DropFileMsg(HWND
我正在尝试创建一个简单的应用程序,用户可以在其中将文件从窗口外部(通常是资源管理器)拖放到窗口内部的区域中。我的最终目的是获取文件路径以便稍后对其进行处理。 目前我可以将文件拖放到该区域,但我从未收到
我想使用 Lazarus 创建 Windows GUI 应用程序,它能够将文件从资源管理器拖到 TEdit 小部件并显示文件路径。 我已经阅读并尝试了一些 delphi 教程,它说你需要处理 WM_D
所以我一直在拼命地尝试自动化拖放功能,并将我对解决方案的搜索范围缩小到相当精炼的代码块: // DragAndDrop.cpp : Defines the entry point for the co
我是一名优秀的程序员,十分优秀!