25 个解决方案
#1
ShellExecute
ShellExecuteEx
ShellExecuteEx
#2
看看全局的鼠标钩子可以完成不
#3
你是想直接运行一个程序吧
用exec这个api呗,开启一个新的进程。
用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
你的这个代码是鼠标在双击图标打开程序这个过程的函数吗?我的意思是:比如start命令是通过找到程序所在的位置后打开它,鼠标是在桌面的程序第一下点击(相当于是找程序的位置)后,第二下打开的,也就是这个第二下是通过什么函数实现的?
#10
这样算是明白点儿,就是说一个程序对双击事件的消息响应函数的作用了,那么每个程序的双击打开响应函数(都是一样的嘛?)是怎样的喃?
#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
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
哦 相当于整个待机桌面就是一个运行的程序,(explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx)就是双击响应的函数的工作过程
#14
参考注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.txt
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.doc
……
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xxx
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.txt
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.doc
……
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xxx
#15
这些东西都在注册表里,很容易找到
另外,通过
工具->文件夹选项->文件类型,选择后缀名,然后点高级->open->编辑,就可以看到双击调用的打开程序
#16
大致如此吧
#17
参考注册表项
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"
#18
这段时间闲看看,发现兄你回答的问题都很在问题的点子上,真乃神人也,佩服!
没少向你学东西,在此感谢!
#19
中断+命令行+中断
#20
4楼的代码可以看一下
#21
感谢大家热心的回答 虽然有些东西还不是很懂!
#22
感谢大家热心的回答 虽然有些东西还不是很懂!
#23
感谢大家的热心回答,虽然还是用很多地方不明白!还需都学习多努力
#24
#25
#1
ShellExecute
ShellExecuteEx
ShellExecuteEx
#2
看看全局的鼠标钩子可以完成不
#3
你是想直接运行一个程序吧
用exec这个api呗,开启一个新的进程。
用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
你的这个代码是鼠标在双击图标打开程序这个过程的函数吗?我的意思是:比如start命令是通过找到程序所在的位置后打开它,鼠标是在桌面的程序第一下点击(相当于是找程序的位置)后,第二下打开的,也就是这个第二下是通过什么函数实现的?
#10
这样算是明白点儿,就是说一个程序对双击事件的消息响应函数的作用了,那么每个程序的双击打开响应函数(都是一样的嘛?)是怎样的喃?
#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
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
哦 相当于整个待机桌面就是一个运行的程序,(explorer.exe根据打开文件的后缀名,查找注册表,找出对应的打开方式,然后调用ShellExecute/ShellExecuteEx)就是双击响应的函数的工作过程
#14
参考注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.txt
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.doc
……
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xxx
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.txt
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.doc
……
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xxx
#15
这些东西都在注册表里,很容易找到
另外,通过
工具->文件夹选项->文件类型,选择后缀名,然后点高级->open->编辑,就可以看到双击调用的打开程序
#16
大致如此吧
#17
参考注册表项
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"
#18
这段时间闲看看,发现兄你回答的问题都很在问题的点子上,真乃神人也,佩服!
没少向你学东西,在此感谢!
#19
中断+命令行+中断
#20
4楼的代码可以看一下
#21
感谢大家热心的回答 虽然有些东西还不是很懂!
#22
感谢大家热心的回答 虽然有些东西还不是很懂!
#23
感谢大家的热心回答,虽然还是用很多地方不明白!还需都学习多努力