none
编程如何实现调用我的程序在双击某个指定的文件夹?(how to programe to run my exe when double click some directory) RRS feed

  • 问题

  • 如何调用我的程序在双击某个指定的文件夹?

    (

    how to programe to run my exe when double click some directory

    )

    • 已编辑 Neko_NoW 2019年6月26日 3:06
    2019年6月26日 3:04

答案

  • 你好,

    我尝试了用autorun.ini来实现你的要求,发它只对盘符才有效,例如将autorun.ini文件放在U盘中,U盘初次挂载在电脑上的时候,打开U盘可以自动打开一个程序。这听起来似乎和病毒无异。所以虽然我成功实现了这个功能,但是这一切都建立在我关了Windows防火墙的前提条件下,Windows安全防护会阻止这样的操作进行,这会损坏系统的安全。

    >>C:\123,123是一个文件夹,双击123文件夹时,执行 C:\1.exe 并且传入C:\123路径,整个运行命令如:C:\1.exe C:\123

    回到你的问题,这在系统层面很难实现,不启动一个进程后台监视的话,直接打开文件夹然后运行程序,这样的操作和病毒无异,Windows不会提供这样的API,系统安全也会阻止这样的操作。所以我推荐你还是考虑下启动后台进程监视来做这件事。

    Best Regards,

    Suarez Zhou



    2019年8月2日 5:09

全部回复

  • 你好,

    感谢你在MSDN论坛发帖。

    >>编程如何实现调用我的程序在双击某个指定的文件夹?

    很抱歉,在不借助外在程序的前提条件下,是无法完成通过打开文件夹的方式同时打开一个自定义的程序。当然如果借助一些外在程序的话是可以实现你的需要,只需要自己编写一个程序,利用 API HOOK来监控指定文件夹的打开即可,当程序监控到文件夹的打开时,调用你自己的程序,间接实现了你所需要的功能。

    Best Regards,

    Suarez Zhou


    2019年6月26日 6:33
  • api hook 使用哪个api函数呢?

    另外我想问问 Shell Extension 实现可以吗?有对应的直接接口吗?或者间接接口吗?

    2019年6月27日 1:05
  • 你好,

    HOOK是钩子,并不是一个API接口,是一种技术,具体用法可以参考底下链接。

    https://www.cnblogs.com/lidabo/archive/2012/11/29/2795269.html

    Note: This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; Therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure that you completely understand the risk before retrieving any software from the Internet.

    如果你需要用Shell Extension修改文件夹的默认打开方式实现你的操作似乎可行,但你的需求是双击文件夹时,打开文件夹的同时打开一个自定义的程序,还是当双击文件夹时仅仅打开一个自定义程序呢?

    Best Regards,

    Suarez Zhou


    2019年6月27日 10:02
  • 你好哦,hook我知道怎么用哦,关于 Shell Extension的解决方案可以提供一下思路吗?万分感激
    2019年6月28日 1:16
  • 你好,

    请问Hook能解决你的问题吗?

    关于Shell Extension,我并没有很好的思路,设计的效果是右键文件夹,通过扩展的选项打开你的程序。这和你需要双击打开文件夹时打开程序的实际效果并不是十分符合。

    Best Reagrds,

    Suarez Zhou



    2019年6月28日 9:26
  • 你好,HOOK不是很完美的一个解决方案,因为需要启动一个进程后台监视.

    其实我主要的目的是希望将打开的文件夹路径通过程序的入口函数(main)传入到我的进程,此时程序有可能注入一个未启动的状态

    2019年6月28日 12:33
  • 你好,

    可以尝试下利用代码通过资源管理器找到explorer.exe进程的当前文件夹路径和你传进程序的文件夹路径做比对,如果相等,也可视作打开了这个文件夹。这似乎也是个不错的方法,不知道是否符合你的要求。

    Best Regards,

    Suarez Zhou

    2019年7月1日 9:42
  • 你好,

    可以尝试下利用代码通过资源管理器找到explorer.exe进程的当前文件夹路径和你传进程序的文件夹路径做比对,如果相等,也可视作打开了这个文件夹。这似乎也是个不错的方法,不知道是否符合你的要求。

    Best Regards,

    Suarez Zhou

    1.这个代码的Demo是如何呢?

    2.文件我希望双击这个文件不是通过资源管理器打开这个文件夹,而是将这个文件夹的路径传递到我的程序哦

    2019年7月23日 7:13
  • 你好,

    很抱歉没有及时看到这个消息。

    >>1.这个代码的Demo是如何呢?

    你可以尝试底下这个控制台demo,它完成了通过资源管理器窗口读取当前文件夹地址,并将地址打印出来。你可以将这个文件夹地址传进程序中。

    #include "pch.h"
    #include <windows.h>
    #include <stdio.h>
    #include <locale.h>
    
    int main()
    {
    	TCHAR str[1024] = TEXT("Hello World");
    	HWND hwnd = NULL;
    	HWND hToolbat;
    
    
    	hwnd = FindWindowEx(NULL, NULL, TEXT("CabinetWClass"), NULL);
    	hwnd = FindWindowEx(hwnd, NULL, TEXT("WorkerW"), NULL);
    	hwnd = FindWindowEx(hwnd, NULL, TEXT("ReBarWindow32"), NULL);
    	hwnd = FindWindowEx(hwnd, NULL, TEXT("Address Band Root"), NULL);
    	hwnd = FindWindowEx(hwnd, NULL, TEXT("msctls_progress32"), NULL);
    	hToolbat = FindWindowEx(hwnd, NULL, TEXT("ToolbarWindow32"), NULL);
    
    
    	SendMessage(hToolbat, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(0, 0));
    	SendMessage(hToolbat, WM_LBUTTONUP, MK_LBUTTON, MAKELONG(0, 0));
    	SendMessage(hToolbat, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(0, 0));
    	SendMessage(hToolbat, WM_LBUTTONUP, MK_LBUTTON, MAKELONG(0, 0));
    
    
    	hwnd = FindWindowEx(hwnd, NULL, TEXT("ComboBoxEx32"), NULL);
    	hwnd = FindWindowEx(hwnd, NULL, TEXT("ComboBox"), NULL);
    	hwnd = FindWindowEx(hwnd, NULL, TEXT("Edit"), NULL);
    
    	if (hwnd == NULL)
    	{
    		wprintf(L"%s\n", L"error");
    		return -1;
    	}
    
    	SendMessage(hwnd, WM_GETTEXT, 1024, (LPARAM)str);
    
    	MessageBox(NULL, str, TEXT("Caption"), 0);
    	return 0;
    }

    >>2.文件我希望双击这个文件不是通过资源管理器打开这个文件夹,而是将这个文件夹的路径传递到我的程序哦

    很抱歉不能准确理解你说的这个不是通过资源管理器打开这个文件夹的意思。打开文件夹这个操作会产生一个窗口,这个窗口如下图所示,就是资源管理器的窗口,通过找窗口的过程找到打开的文件夹地址就是上面demo的实现原理。不知道这个demo是否符合你的要求。

    如果我的回复能解决你的问题,请标记正确的回复为答案,这会帮助其他有着相同问题的社区成员更快地找到解决方案。

    Best Regards,

    Suarez Zhou



    2019年7月30日 2:43
  • >>2.文件我希望双击这个文件不是通过资源管理器打开这个文件夹,而是将这个文件夹的路径传递到我的程序哦

         嗨,首先很感激你的代码,你的代码是可运行的,但是不是我希望的效果!我希望的效果需要下面的要求

        在资源管理器中,双击文件夹时,调用我程序,并且将此文件夹的路径传入到程序的main函数中

    例:

    C:\123,123是一个文件夹,双击123文件夹时,执行 C:\1.exe 并且传入C:\123路径,整个运行命令如:C:\1.exe C:\123

    2019年7月31日 1:38
  • 你好,

    我尝试了用autorun.ini来实现你的要求,发它只对盘符才有效,例如将autorun.ini文件放在U盘中,U盘初次挂载在电脑上的时候,打开U盘可以自动打开一个程序。这听起来似乎和病毒无异。所以虽然我成功实现了这个功能,但是这一切都建立在我关了Windows防火墙的前提条件下,Windows安全防护会阻止这样的操作进行,这会损坏系统的安全。

    >>C:\123,123是一个文件夹,双击123文件夹时,执行 C:\1.exe 并且传入C:\123路径,整个运行命令如:C:\1.exe C:\123

    回到你的问题,这在系统层面很难实现,不启动一个进程后台监视的话,直接打开文件夹然后运行程序,这样的操作和病毒无异,Windows不会提供这样的API,系统安全也会阻止这样的操作。所以我推荐你还是考虑下启动后台进程监视来做这件事。

    Best Regards,

    Suarez Zhou



    2019年8月2日 5:09
  • 对的呢,很感激你的回复

    2019年8月9日 2:00