• 827阅读
  • 10回复

[讨论]Qt 为什么管理员权限下无法进行拖拽,但是MFC却可以呢? [复制链接]

上一主题 下一主题
离线lwei24
 

只看楼主 倒序阅读 楼主  发表于: 2023-05-12
如题,各位大佬们,Qt的拖拽功能为什么在管理员权限下无法进行,但是MFC却可以呢?有什么办法可以突破这个限制呢?
离线zhangxin

只看该作者 1楼 发表于: 2023-05-12
我也发现这个问题了,查了一下说是以管理员权限运行时,程序与Explorer不是平等关系了,所以接收不到消息,找到的是VC的解决方式,没找到QT的
离线lwei24

只看该作者 2楼 发表于: 2023-05-12
回 zhangxin 的帖子
zhangxin:我也发现这个问题了,查了一下说是以管理员权限运行时,程序与Explorer不是平等关系了,所以接收不到消息,找到的是VC的解决方式,没找到QT的 (2023-05-12 17:05) 

是的,之前我还想通过VC的方式在Qt上去解决管理员权限运行时拖拽的问题。但是试了很久都没有成功。原本以为都是C/C++,按理说技术没有国界,可是却不能满足管理员权限运行时拖拽。这样,对于开发者来说,或许没有多大的影响,但是对于用户来说,简直是不理解,直接就会认为是软件的问题……
离线lwei24

只看该作者 3楼 发表于: 2023-05-12
回 zhangxin 的帖子
zhangxin:我也发现这个问题了,查了一下说是以管理员权限运行时,程序与Explorer不是平等关系了,所以接收不到消息,找到的是VC的解决方式,没找到QT的 (2023-05-12 17:05) 

请问在windows环境下,不考虑硬件环境,只考虑应用层技术,你还碰到什么类似这样VC能做到的,Qt不能做到的问题吗?
离线zhangxin

只看该作者 4楼 发表于: 2023-05-14
回 lwei24 的帖子
lwei24:请问在windows环境下,不考虑硬件环境,只考虑应用层技术,你还碰到什么类似这样VC能做到的,Qt不能做到的问题吗? (2023-05-12 18:15) 

基本上VC能干的Qt都能干吧,有些原生的东西,Qt实现起来比VC麻烦一些,有遇到过一些,但是忽然让我罗列出来,还真想不出来了
离线ragtime

只看该作者 5楼 发表于: 2023-05-15
如果是拖拽文件的话
可以参考如下代码

void CMainWindow::initDropFileMSG()
{
    HWND hwnd = (HWND)this->winId();
    CHANGEFILTERSTRUCT chfit1 = { sizeof(CHANGEFILTERSTRUCT) };
    CHANGEFILTERSTRUCT chfit2 = { sizeof(CHANGEFILTERSTRUCT) };
    //消息过滤,允许低权限往高权限发消息
    ChangeWndMessageFilterOk(hwnd, WM_DROPFILES, MSGFLT_ALLOW, &chfit1);
    ChangeWndMessageFilterOk(hwnd, 0x0049, MSGFLT_ALLOW, &chfit2);

    RevokeDragDrop((HWND)this->winId()); //先注销qt本身的拖拽
    DragAcceptFiles(hwnd, TRUE); //允许接收拖拽文件消息
}
离线lwei24

只看该作者 6楼 发表于: 2023-05-15
回 zhangxin 的帖子
zhangxin:基本上VC能干的Qt都能干吧,有些原生的东西,Qt实现起来比VC麻烦一些,有遇到过一些,但是忽然让我罗列出来,还真想不出来了 (2023-05-14 00:24) 

好的,多谢了
离线lwei24

只看该作者 7楼 发表于: 2023-05-16
回 ragtime 的帖子
ragtime:如果是拖拽文件的话
可以参考如下代码
void CMainWindow::initDropFileMSG()
{
....... (2023-05-15 11:31) 

哦哦,这样可以在管理员权限下实现拖拽吗?ChangeWndMessageFilterOk这些需要添加那些头文件呢?
离线ragtime

只看该作者 8楼 发表于: 2023-05-30
回 lwei24 的帖子
lwei24:哦哦,这样可以在管理员权限下实现拖拽吗?ChangeWndMessageFilterOk这些需要添加那些头文件呢? (2023-05-16 10:21) 

可以的。
ChangeWndMessageFilterOk忘了贴代码了,如下

BOOL CMainWindow::ChangeWndMessageFilterOk(HWND hWnd, UINT nMessage, DWORD dwAction, PCHANGEFILTERSTRUCT chfit)
{
    typedef BOOL (WINAPI *ChangeWindowMessageFilterOkFn)(HWND, UINT, DWORD, PCHANGEFILTERSTRUCT);
    HMODULE hModUser32 = NULL;
    hModUser32 = LoadLibrary(L"user32.dll");
    if (hModUser32 == NULL)
    {
        qDebug()<<"load failed";
        return FALSE;
    }

    ChangeWindowMessageFilterOkFn pfnChangeWindowMessageFilter = (ChangeWindowMessageFilterOkFn) GetProcAddress(hModUser32, "ChangeWindowMessageFilterEx");
    if (pfnChangeWindowMessageFilter == NULL)
    {
        FreeLibrary(hModUser32);
        qDebug()<<"failed";
        return FALSE;
    }

    FreeLibrary(hModUser32);
    BOOL ret = pfnChangeWindowMessageFilter(hWnd, nMessage, dwAction, chfit);
    const QString strOut = QString("%1 ret = [%2] ExtStatus=[%3]\n").arg(__FUNCTION__, QString::number(ret), QString::number(chfit->ExtStatus));
    qDebug()<<strOut;
    return ret;
}
离线lwei24

只看该作者 9楼 发表于: 2023-05-31
回 ragtime 的帖子
ragtime:可以的。
ChangeWndMessageFilterOk忘了贴代码了,如下
BOOL CMainWindow::ChangeWndMessageFilterOk(HWND hWnd, UINT nMessage, DWORD dwAction, PCHANGEFILTERSTRUCT chfit)
....... (2023-05-30 14:35) 

试过,不可以。就算按照您的思路注销了先注销qt本身的拖拽,然后DragAcceptFiles,那您是如何接受到消息后如何处理接受的信息?您说的这个方法,我在Qt工程中试了两三次,先注销qt本身的拖拽后,连拖住信息都没有了,虽然用DragAcceptFiles接收拖拽文件消息,但是要怎么拿到接受到的文件信息呢???不知道您是否可以提供一下您试成功的例子给我参考一下呢?
离线ragtime

只看该作者 10楼 发表于: 2023-06-12
回 lwei24 的帖子
lwei24:
[表情]试过,不可以。就算按照您的思路注销了先注销qt本身的拖拽,然后DragAcceptFiles,那您是如何接受到消息后如何处理接受的信息?您说的这个方法,我在Qt工程中试了两三次,先注销qt本身的拖拽后,连拖住信息都没有了,虽然用DragAcceptFiles接收拖拽文件消息,但是要怎么拿到接受到的文件信息呢???不知道您是否可以提供一下您试成功的例子给我参考一下呢?

忘了说后续要响应nativevent
老早之前写的代码了忘的差不多了。

  1. bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
  2. {
  3.     if(eventType == "windows_generic_MSG" || eventType == "windows_dispatcher_MSG")
  4.     {
  5.         MSG* pMsg = reinterpret_cast<MSG*>(message);
  6.         if(pMsg->message == WM_DROPFILES)
  7.         {
  8.             HDROP hDropInfo = (HDROP)pMsg->wParam;
  9.             wchar_t szFilePathName[_MAX_PATH] = {0};
  10.             const UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
  11.             if(nNumOfFiles >0)
  12.             {
  13.                 DragQueryFile(hDropInfo, 0, szFilePathName, _MAX_PATH); //直接取第一个 入参UINT iFile  = 0
  14.                 const QString currentfile = QString::fromWCharArray(szFilePathName);
  15.                 //currentfile 为当前拖拽文件
  16.                 //dosth
  17.             }
  18.             DragFinish(hDropInfo);
  19.         }
  20.     }
  21.     return false;
  22. }

快速回复
限100 字节
 
上一个 下一个