windows系统是怎样实现鼠标双击打开一个程序?

时间:2023-01-15 09:57:12
是通过函数还是cmd命令实现的,如果是函数c++有这样的函数嘛?

25 个解决方案

#1


ShellExecute

ShellExecuteEx

#2


看看全局的鼠标钩子可以完成不

#3


你是想直接运行一个程序吧
用exec这个api呗,开启一个新的进程。

#4




bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd)
{
char lpSubKey[500];
HKEY hKey;
char strTemp[MAX_PATH];
LONG nSize = sizeof(strTemp);
char *lpstrCat = NULL;
memset(strTemp, 0, sizeof(strTemp));

char *lpExt = strrchr(lpFile, '.');
if (!lpExt)
return false;

if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpExt, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
return false;

RegQueryValueA(hKey, NULL, strTemp, &nSize);
RegCloseKey(hKey);

memset(lpSubKey, 0, sizeof(lpSubKey));
wsprintf(lpSubKey, "%s\\shell\\open\\command", strTemp);

if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpSubKey, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
return false;

memset(strTemp, 0, sizeof(strTemp));
nSize = sizeof(strTemp);
RegQueryValue(hKey, NULL, strTemp, &nSize);
RegCloseKey(hKey);

lpstrCat = strstr(strTemp, "\"%1");
if (lpstrCat == NULL)
lpstrCat = strstr(strTemp, "%1");

if (lpstrCat == NULL)
{
lstrcatA(strTemp, " ");
lstrcatA(strTemp, lpFile);
}

else
lstrcpyA(lpstrCat, lpFile);

char Desktop[16] ="WinSta0\\Default";

STARTUPINFO si = {0};
PROCESS_INFORMATION pi;
si.cb = sizeof si;
if (nShowCmd != SW_HIDE)
si.lpDesktop = Desktop; 

CreateProcessA(NULL, strTemp, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
}

2楼说错了,请无视。上面的代码是从远控中提出来的,仅供参考

#5


应该是通过获取鼠标事件实现的

#6


你的这个代码是鼠标在双击图标打开程序这个过程的函数吗?

#7


window,双击事件被explorer.exe捕获,然后根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx

#8


双击鼠标会产生消息给系统,触发打开事件

#9


引用 4 楼 maoxing63570 的回复:
C/C++ code


bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd)
{    
    char    lpSubKey[500];
    HKEY    hKey;
    char    strTemp[MAX_PATH];
    LONG    nSize = sizeof(strTemp);
    char……

你的这个代码是鼠标在双击图标打开程序这个过程的函数吗?我的意思是:比如start命令是通过找到程序所在的位置后打开它,鼠标是在桌面的程序第一下点击(相当于是找程序的位置)后,第二下打开的,也就是这个第二下是通过什么函数实现的?

#10


引用 7 楼 fcmsuck 的回复:
window,双击事件被explorer.exe捕获,然后根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx

这样算是明白点儿,就是说一个程序对双击事件的消息响应函数的作用了,那么每个程序的双击打开响应函数(都是一样的嘛?)是怎样的喃?

#11


所有的操作是explorer.exe做的,双击事件被explorer.exe捕获,explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx,explorer是个系统进程,也没啥

#12


在cmd窗口里面输入以下命令
c:\> assoc .txt

.txt=txtfile
c:\> ftype txtfile

txtfile=C:\WINDOWS\notepad.exe %1
c:\> assoc .doc

.doc=Word.Document.8
c:\> ftype Word.Document.8

Word.Document.8="C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE" /n /dde

#13


引用 11 楼 fcmsuck 的回复:
所有的操作是explorer.exe做的,双击事件被explorer.exe捕获,explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx,explorer是个系统进程,也没啥

哦  相当于整个待机桌面就是一个运行的程序,(explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx)就是双击响应的函数的工作过程

#14


参考注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.txt
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.doc
……
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xxx

#15


引用 12 楼 zhao4zhong1 的回复:
在cmd窗口里面输入以下命令
c:\>assoc .txt

.txt=txtfile
c:\>ftype txtfile

txtfile=C:\WINDOWS\notepad.exe %1
c:\>assoc .doc

.doc=Word.Document.8
c:\>ftype Word.Document.8

Word.Document.8="C:\Progra……

这些东西都在注册表里,很容易找到
另外,通过
工具->文件夹选项->文件类型,选择后缀名,然后点高级->open->编辑,就可以看到双击调用的打开程序

#16


引用 13 楼 zf424 的回复:
引用 11 楼 fcmsuck 的回复:

所有的操作是explorer.exe做的,双击事件被explorer.exe捕获,explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx,explorer是个系统进程,也没啥

哦  相当于整个待机桌面就是一个运行的程序,(explorer.exe根据打开文件……

大致如此吧

#17


参考注册表项
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"

#18


引用 17 楼 zhao4zhong1 的回复:
参考注册表项
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"

这段时间闲看看,发现兄你回答的问题都很在问题的点子上,真乃神人也,佩服!
没少向你学东西,在此感谢!

#19


中断+命令行+中断

#20


4楼的代码可以看一下

#21


感谢大家热心的回答 虽然有些东西还不是很懂!

#22


感谢大家热心的回答 虽然有些东西还不是很懂!

#23


感谢大家的热心回答,虽然还是用很多地方不明白!还需都学习多努力

#24


该回复于2011-12-28 11:24:29被版主删除

#25


该回复于2011-12-28 11:24:28被版主删除

#1


ShellExecute

ShellExecuteEx

#2


看看全局的鼠标钩子可以完成不

#3


你是想直接运行一个程序吧
用exec这个api呗,开启一个新的进程。

#4




bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd)
{
char lpSubKey[500];
HKEY hKey;
char strTemp[MAX_PATH];
LONG nSize = sizeof(strTemp);
char *lpstrCat = NULL;
memset(strTemp, 0, sizeof(strTemp));

char *lpExt = strrchr(lpFile, '.');
if (!lpExt)
return false;

if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpExt, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
return false;

RegQueryValueA(hKey, NULL, strTemp, &nSize);
RegCloseKey(hKey);

memset(lpSubKey, 0, sizeof(lpSubKey));
wsprintf(lpSubKey, "%s\\shell\\open\\command", strTemp);

if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpSubKey, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
return false;

memset(strTemp, 0, sizeof(strTemp));
nSize = sizeof(strTemp);
RegQueryValue(hKey, NULL, strTemp, &nSize);
RegCloseKey(hKey);

lpstrCat = strstr(strTemp, "\"%1");
if (lpstrCat == NULL)
lpstrCat = strstr(strTemp, "%1");

if (lpstrCat == NULL)
{
lstrcatA(strTemp, " ");
lstrcatA(strTemp, lpFile);
}

else
lstrcpyA(lpstrCat, lpFile);

char Desktop[16] ="WinSta0\\Default";

STARTUPINFO si = {0};
PROCESS_INFORMATION pi;
si.cb = sizeof si;
if (nShowCmd != SW_HIDE)
si.lpDesktop = Desktop; 

CreateProcessA(NULL, strTemp, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
}

2楼说错了,请无视。上面的代码是从远控中提出来的,仅供参考

#5


应该是通过获取鼠标事件实现的

#6


你的这个代码是鼠标在双击图标打开程序这个过程的函数吗?

#7


window,双击事件被explorer.exe捕获,然后根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx

#8


双击鼠标会产生消息给系统,触发打开事件

#9


引用 4 楼 maoxing63570 的回复:
C/C++ code


bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd)
{    
    char    lpSubKey[500];
    HKEY    hKey;
    char    strTemp[MAX_PATH];
    LONG    nSize = sizeof(strTemp);
    char……

你的这个代码是鼠标在双击图标打开程序这个过程的函数吗?我的意思是:比如start命令是通过找到程序所在的位置后打开它,鼠标是在桌面的程序第一下点击(相当于是找程序的位置)后,第二下打开的,也就是这个第二下是通过什么函数实现的?

#10


引用 7 楼 fcmsuck 的回复:
window,双击事件被explorer.exe捕获,然后根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx

这样算是明白点儿,就是说一个程序对双击事件的消息响应函数的作用了,那么每个程序的双击打开响应函数(都是一样的嘛?)是怎样的喃?

#11


所有的操作是explorer.exe做的,双击事件被explorer.exe捕获,explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx,explorer是个系统进程,也没啥

#12


在cmd窗口里面输入以下命令
c:\> assoc .txt

.txt=txtfile
c:\> ftype txtfile

txtfile=C:\WINDOWS\notepad.exe %1
c:\> assoc .doc

.doc=Word.Document.8
c:\> ftype Word.Document.8

Word.Document.8="C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE" /n /dde

#13


引用 11 楼 fcmsuck 的回复:
所有的操作是explorer.exe做的,双击事件被explorer.exe捕获,explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx,explorer是个系统进程,也没啥

哦  相当于整个待机桌面就是一个运行的程序,(explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx)就是双击响应的函数的工作过程

#14


参考注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.txt
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.doc
……
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xxx

#15


引用 12 楼 zhao4zhong1 的回复:
在cmd窗口里面输入以下命令
c:\>assoc .txt

.txt=txtfile
c:\>ftype txtfile

txtfile=C:\WINDOWS\notepad.exe %1
c:\>assoc .doc

.doc=Word.Document.8
c:\>ftype Word.Document.8

Word.Document.8="C:\Progra……

这些东西都在注册表里,很容易找到
另外,通过
工具->文件夹选项->文件类型,选择后缀名,然后点高级->open->编辑,就可以看到双击调用的打开程序

#16


引用 13 楼 zf424 的回复:
引用 11 楼 fcmsuck 的回复:

所有的操作是explorer.exe做的,双击事件被explorer.exe捕获,explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx,explorer是个系统进程,也没啥

哦  相当于整个待机桌面就是一个运行的程序,(explorer.exe根据打开文件……

大致如此吧

#17


参考注册表项
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"

#18


引用 17 楼 zhao4zhong1 的回复:
参考注册表项
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"

这段时间闲看看,发现兄你回答的问题都很在问题的点子上,真乃神人也,佩服!
没少向你学东西,在此感谢!

#19


中断+命令行+中断

#20


4楼的代码可以看一下

#21


感谢大家热心的回答 虽然有些东西还不是很懂!

#22


感谢大家热心的回答 虽然有些东西还不是很懂!

#23


感谢大家的热心回答,虽然还是用很多地方不明白!还需都学习多努力

#24


该回复于2011-12-28 11:24:29被版主删除

#25


该回复于2011-12-28 11:24:28被版主删除