我怎么不对????????

zhaoming 2000-02-22 04:26:00
我想实现通过程序向窗体发按键,这么做不行,怎么办??
HWND hwnd;
ShellExecute(hwnd,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_MAXIMIZE );
::SendMessage(hwnd,WM_KEYDOWN,0x41,NULL);
...全文
225 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Star 2000-02-23
  • 打赏
  • 举报
回复
关键的错误是你把ShellExecute的第一个参数当作是关联程序窗口句柄了,
其实根本是两回事,这个句柄是用来指明在接受在ShellExecute函数执行
中系统就此事件发出的消息的窗口。

Fancy和zjy的代码应该都是可行的,不过Fancy的BringWindowToTop()
纯属画蛇添足,原因正如上所述,我想还是zjy的方法好些,如果你的程序要
抢夺键盘事件的话,你不会就为了调出编辑器看看吧?

BTW:我不认为你的程序会有很好的效果,因为你根本不知道.txt关联程序的
风格如何,zjy的方法是需要假定关联程序窗口标题以.txt文件名开头,而且
还要知道窗口中处理编辑字窗口的标示号(我猜测zjy是用notepad.exe做的
试验)。事实上完全可能标题中根本不含有这个文件名。而一个好的编辑器肯
定是MDI的,你还要先取得该窗口的当前字窗口,再取得该字窗口的编辑字窗口,
如果这个编辑程序再复杂一些,那就...,何况你根本就不知道这些信息。

所以我认为如果你的程序只是在自己机器上玩,或者你能确切知道关联程序风格,
就保持这样编码吧!要是另外一回事,还是明确使用一个自己知道具体风格的
编辑程序吧,不要使用系统关联。

当然我的说法是建立在你确实是想调用编辑器的基础上的,如果你只不过要求
象你所说的那样“利用程序向窗体发按健”,那SendMessage()就够了,剩下
的只是hwnd窗口是否响应你的问题,也就是你得找准对象,如上所述,这好像
不再仅仅是编程知识上的事,hehe...
Un1 2000-02-22
  • 打赏
  • 举报
回复
ShellExecute是异步的吧,你延时在SendMessage试试.
upstream 2000-02-22
  • 打赏
  • 举报
回复
把代码贴上来。
zjy 2000-02-22
  • 打赏
  • 举报
回复
:BOOL CALLBACK EnumWindowsProc(HWND hwnd,char* lParam)
:{
: char szTitle[1024];
: GetWindowText(hwnd,szTitle,1023);
: if(strncmp(szTitle,lParam,strlen(lParam))==0){
: HWND hEdit = ::GetDlgItem(hwnd,0x0f);
: if(hEdit != NULL){
: ::SendMessage(hEdit,WM_CHAR,0x41,0x001e0001);
: }
: return FALSE;
: }
: return TRUE;
:}
:void CTestDlg::OnOK()
:{
: if(!bNotepadLoaded){
: ShellExecute(m_hWnd,NULL,textname,NULL,_T("d:\\"),SW_MAXIMIZE );
: bNotepadLoaded = TRUE;
: }
: EnumWindows((WNDENUMPROC)EnumWindowsProc,(LPARAM)textname);
:}
zjy 2000-02-22
  • 打赏
  • 举报
回复
BOOL CALLBACK EnumWindowsProc(HWND hwnd,char* lParam)
{
char szTitle[1024];
GetWindowText(hwnd,szTitle,1023);
if(strncmp(szTitle,lParam,strlen(lParam))==0){
HWND hEdit = ::GetDlgItem(hwnd,0x0f);
if(hEdit != NULL){
::SendMessage(hEdit,WM_CHAR,0x41,0x001e0001);
}
return FALSE;
}
return TRUE;
}
void CTestDlg::OnOK()
{
if(!bNotepadLoaded){
ShellExecute(m_hWnd,NULL,textname,NULL,_T("d:\\"),SW_MAXIMIZE );
bNotepadLoaded = TRUE;
}
EnumWindows((WNDENUMPROC)EnumWindowsProc,(LPARAM)textname);
}
Fancy 2000-02-22
  • 打赏
  • 举报
回复
::BringWindowToTop(hwnd);
keybd_event(0x41, 0, 0, 0);
keybd_event(0x41, 0, KEYEVENTF_KEYUP, 0);
Sniper 2000-02-22
  • 打赏
  • 举报
回复
你可以把源代码发给我,我帮你看看。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧