keybd_event 的小問題 |
尚未結案
|
ccobj
一般會員 發表:6 回覆:27 積分:21 註冊:2003-12-02 發送簡訊給我 |
各位前輩
我在討論區內找到一些keybd_event的文章
並依樣畫葫蘆的寫了下面這段程式
工作是將字串a模擬按鍵到切換的視窗
不過為何記事本接收到的按鍵會是 a11 呢
似乎會變成 A->a B->b a->1 b->2
要如何解決呢
先說聲謝謝... AnsiString a="Aa1"; HWND hWnd = FindWindow(NULL,"未命名 - 記事本"); if (hWnd)
{
ShowWindow(hWnd,SW_SHOWNORMAL);
SetForegroundWindow(hWnd);
SetActiveWindow(hWnd); for( int x = 1; x <= a.Length(); x )
{
keybd_event(a[x], MapVirtualKey(a[x],0), 0, 0);
keybd_event(a[x], MapVirtualKey(a[x],0), KEYEVENTF_KEYUP, 0);
Sleep(10);
}
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); }else{
ShowMessage("未開啟");
}
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 各位前輩 我在討論區內找到一些keybd_event的文章 並依樣畫葫蘆的寫了下面這段程式 工作是將字串a模擬按鍵到切換的視窗 不過為何記事本接收到的按鍵會是 a11 呢 似乎會變成 A->a B->b a->1 b->2 要如何解決呢 先說聲謝謝... AnsiString a="Aa1"; HWND hWnd = FindWindow(NULL,"未命名 - 記事本"); if (hWnd) { ShowWindow(hWnd,SW_SHOWNORMAL); SetForegroundWindow(hWnd); SetActiveWindow(hWnd); for( int x = 1; x <= a.Length(); x ) { keybd_event(a[x], MapVirtualKey(a[x],0), 0, 0); keybd_event(a[x], MapVirtualKey(a[x],0), KEYEVENTF_KEYUP, 0); Sleep(10); } keybd_event(VK_RETURN, 0, 0, 0); keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); }else{ ShowMessage("未開啟"); }ccobj你好: 之前研究過的,結論就是這個 class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString a="A1a"; char c; HWND hWnd = FindWindow(NULL,"未命名 - 記事本"); if (hWnd) { ShowWindow(hWnd,SW_SHOWNORMAL); SetForegroundWindow(hWnd); SetActiveWindow(hWnd); for (int i=1;i<=a.Length();i ) { c=a[i]; if (c>=65 && c<=90) { keybd_event(VK_SHIFT,0,0,0); keybd_event(c,0,0,0); keybd_event(c,0,KEYEVENTF_KEYUP,0); keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); } else if (c>=97 && c<=122) { c-=32; keybd_event(c,0,0,0); keybd_event(c,0,KEYEVENTF_KEYUP,0); } else { keybd_event(c,0,0,0); keybd_event(c,0,KEYEVENTF_KEYUP,0); } } keybd_event(VK_RETURN, 0, 0, 0); keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); } else { ShowMessage("未開啟"); } } 嗯,大概是這樣,之前研究的,但沒研究什麼亂是亂成你那樣的結果! |
ccobj
一般會員 發表:6 回覆:27 積分:21 註冊:2003-12-02 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 謝謝m8815010的建議 我已經將程式改好了 不過我最主要的功能是要能夠輸入一排網址 網址用到的字元 不外乎 : / @ ? = & - _ 這樣寫下來 幾乎有一半的程式碼都在判斷這些特殊符號 不知是否有更完美的解決方案ccobj你好: 當然有比較好的方式,這類的討論文章站上相當的豊富,你可以自行 class="code"> ~~ TForm1 *Form1; BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam); //找出NotePad裏面的那個Edit元件的handle值的function HWND hEditControl; 那個Edit元件的handle值 //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { HWND hWnd = FindWindow(NULL,"未命名 - 記事本"); if (hWnd) { EnumChildWindows(hWnd,(WNDENUMPROC)EnumChildProc,0); //開始找 AnsiString url="http:\\www.cpbl.com.tw"; //方法一,一個字元一個字元將url字串送給那Edit //for (int i=1;i<=url.Length();i ) // SendMessage(hEditControl,WM_CHAR,url[i],0); //方法二,直接把整個url字串設成Edit元件的Text值(也就是覆蓋) //SendMessage(hEditControl,WM_SETTEXT,0,(LPARAM)(LPCTSTR)url.c_str()); //方法三,直接把整個url字串加在Edit元件原來的Text值後面(不覆蓋) char buf[2048]; ZeroMemory(buf,2048); SendMessage(hEditControl,WM_GETTEXT,2048,(LPARAM)buf); AnsiString str=AnsiString(buf) url; SendMessage(hEditControl,WM_SETTEXT,0,(LPARAM)(LPCTSTR)str.c_str()); } } //--------------------------------------------------------------------------- BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam) // function main body { char classname[128]; ZeroMemory(classname,128); GetClassName(hwnd,classname,128); if (AnsiString(classname)=="Edit") { hEditControl=hwnd; return false; } else return true; } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |