Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/ttpmenu/ttpmenu.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10706 - (show annotations) (download) (as text)
Sun May 14 15:37:30 2023 UTC (10 months, 4 weeks ago) by zmatsuo
File MIME type: text/x-c++src
File size: 87240 byte(s)
ttpmenu のダイアログ,メニューをUnicode APIを使用するよう修正

- 簡単に切り替えることができる部分はUnicode版を使用すようにした
- TERATERM.INI への参照をUnicodeに変更
- lng ファイルへの参照を一部Unicode化
1 /*
2 * Copyright (C) S.Hayakawa NTT-IT 1998-2002
3 * (C) 2002- TeraTerm Project
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 #define STRICT
30
31 #include <windows.h>
32 #include <commctrl.h>
33 #include <windowsx.h> // for GET_X_LPARAM(), GET_Y_LPARAM()
34 #include <string.h>
35 #define _CRTDBG_MAP_ALLOC
36 #include <stdlib.h>
37 #include <crtdbg.h>
38
39 #include "ttpmenu.h"
40 #include "registry.h"
41 #include "winmisc.h"
42 #include "resource.h"
43
44 #include "ttlib.h"
45 #include "codeconv.h"
46 #include "win32helper.h"
47 #include "dlglib.h"
48 #include "asprintf.h"
49
50 // �f�t�H���g�C���X�g�[�������J�����g�f�B���N�g��
51 #define DEFAULT_PATH "."
52
53 // �O���[�o������
54 HWND g_hWnd; // ���C�����n���h��
55 HWND g_hWndMenu = NULL; // �����_�C�A���O���n���h��
56 HWND g_hWndTip; // �����_�C�A���O���c�[���`�b�v���n���h��
57 HICON g_hIcon; // �A�v���P�[�V�����A�C�R�����n���h��
58 HICON g_hIconSmall; // �A�v���P�[�V�����A�C�R��(16x16)���n���h��
59 HMENU g_hMenu; // ���j���[�i���\���j���n���h��
60 HMENU g_hSubMenu; // �|�b�v�A�b�v���j���[���n���h��
61 HMENU g_hListMenu; // ���������|�b�v�A�b�v���j���[���n���h��
62 HMENU g_hConfigMenu; // �\�������|�b�v�A�b�v���j���[���n���h��
63 HHOOK g_hHook = NULL; // �c�[���`�b�v���A�t�b�N���n���h��
64 HINSTANCE g_hI; // �A�v���P�[�V�����C���X�^���X
65
66 JobInfo g_JobInfo; // �J�����g�����������\�����i�����_�C�A���O�j
67 MenuData g_MenuData; // TeraTerm Menu���\�����������\����
68
69 wchar_t *SetupFNameW; // TERATERM.INI
70 char UILanguageFile[MAX_PATH];
71 wchar_t *UILanguageFileW;
72 HFONT g_AboutFont;
73 HFONT g_ConfigFont;
74 HFONT g_DetailFont;
75
76 // ttdlg.c ���������e
77 // ���s�t�@�C�������o�[�W�������������� (2005.2.28 yutaka)
78 void get_file_version(char *exefile, int *major, int *minor, int *release, int *build)
79 {
80 typedef struct {
81 WORD wLanguage;
82 WORD wCodePage;
83 } LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
84 LPLANGANDCODEPAGE lplgcode;
85 UINT unLen;
86 DWORD size;
87 char *buf = NULL;
88 BOOL ret;
89 int i;
90 char fmt[80];
91 char *pbuf;
92
93 size = GetFileVersionInfoSize(exefile, NULL);
94 if (size == 0) {
95 goto error;
96 }
97 buf = (char *)malloc(size);
98 ZeroMemory(buf, size);
99
100 if (GetFileVersionInfo(exefile, 0, size, buf) == FALSE) {
101 goto error;
102 }
103
104 ret = VerQueryValue(buf,
105 "\\VarFileInfo\\Translation",
106 (LPVOID *)&lplgcode, &unLen);
107 if (ret == FALSE)
108 goto error;
109
110 for (i = 0 ; i < (int)(unLen / sizeof(LANGANDCODEPAGE)) ; i++) {
111 _snprintf(fmt, sizeof(fmt), "\\StringFileInfo\\%04x%04x\\FileVersion",
112 lplgcode[i].wLanguage, lplgcode[i].wCodePage);
113 VerQueryValue(buf, fmt, (LPVOID *)&pbuf, &unLen);
114 if (unLen > 0) { // get success
115 int n, a, b, c, d;
116
117 n = sscanf(pbuf, "%d, %d, %d, %d", &a, &b, &c, &d);
118 if (n == 4) { // convert success
119 *major = a;
120 *minor = b;
121 *release = c;
122 *build = d;
123 break;
124 }
125 }
126 }
127
128 free(buf);
129 return;
130
131 error:
132 free(buf);
133 *major = *minor = *release = *build = 0;
134 }
135
136
137 /* ==========================================================================
138 Function Name : (BOOL) ExecStartup()
139 Outline : �X�^�[�g�A�b�v�������W���u�����s�����B
140 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
141 Return Value : ���� TRUE
142 Reference :
143 Renewal :
144 Notes :
145 Attention :
146 Up Date :
147 ======1=========2=========3=========4=========5=========6=========7======= */
148 BOOL ExecStartup(HWND hWnd)
149 {
150 char szEntryName[MAX_PATH];
151 char szJobName[MAXJOBNUM][MAX_PATH];
152 HKEY hKey;
153 DWORD dwCnt;
154 DWORD dwIndex = 0;
155 DWORD dwSize = MAX_PATH;
156
157 if ((hKey = RegOpen(HKEY_CURRENT_USER, TTERM_KEY)) != INVALID_HANDLE_VALUE) {
158 while (RegEnumEx(hKey, dwIndex, szEntryName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
159 ::lstrcpy(szJobName[dwIndex++], szEntryName);
160 dwSize = MAX_PATH;
161 }
162 ::lstrcpy(szJobName[dwIndex], "");
163 RegClose(hKey);
164
165 for (dwCnt = 0; dwCnt < dwIndex; dwCnt++)
166 ConnectHost(hWnd, 0, szJobName[dwCnt]);
167 }
168
169 return TRUE;
170 }
171
172 /* ==========================================================================
173 Function Name : (BOOL) ErrorMessage()
174 Outline : �w�����b�Z�[�W�{�V�X�e�����G���[���b�Z�[�W���\�������B
175 Arguments : HWND hWnd (In) �e�E�C���h�E���n���h��
176 : LPTSTR msg,... (In) �C�����b�Z�[�W������
177 Return Value : ���� TRUE
178 Reference :
179 Renewal :
180 Notes :
181 Attention :
182 Up Date :
183 ======1=========2=========3=========4=========5=========6=========7======= */
184 BOOL ErrorMessage(HWND hWnd, DWORD dwErr, LPTSTR msg,...)
185 {
186 char szBuffer[MAX_PATH] = "";
187
188 va_list ap;
189 va_start(ap, msg);
190 vsprintf(szBuffer + ::lstrlen(szBuffer), msg, ap);
191 va_end(ap);
192
193 ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
194 NULL,
195 dwErr,
196 LANG_NEUTRAL,
197 szBuffer + ::lstrlen(szBuffer),
198 MAX_PATH,
199 NULL);
200
201 MessageBox(hWnd, szBuffer, "TeraTerm Menu", MB_ICONSTOP | MB_OK);
202
203 return TRUE;
204 }
205
206 /* ==========================================================================
207 Function Name : (BOOL) SetMenuFont()
208 Outline : �t�H���g�w���_�C�A���O���\�����A�w���������t�H���g��
209 : ���������B
210 Arguments : HWND hWnd (In) �e�E�C���h�E���n���h��
211 Return Value : ���� TRUE
212 Reference :
213 Renewal :
214 Notes :
215 Attention :
216 Up Date :
217 ======1=========2=========3=========4=========5=========6=========7======= */
218 BOOL SetMenuFont(HWND hWnd)
219 {
220 HWND hFontWnd;
221 DWORD rgbColors;
222 LOGFONT lfFont;
223 CHOOSEFONT chooseFont;
224 static int open = 0;
225
226 if (open == 1) {
227 while ((hFontWnd = ::FindWindow(NULL, "Font")) != NULL) {
228 if (hWnd == ::GetParent(hFontWnd)) {
229 ::SetForceForegroundWindow(hFontWnd);
230 break;
231 }
232 }
233 return TRUE;
234 }
235 open = 1;
236
237 lfFont = g_MenuData.lfFont;
238 rgbColors = g_MenuData.crMenuTxt;
239
240 memset((void *) &chooseFont, 0, sizeof(CHOOSEFONT));
241 chooseFont.lStructSize = sizeof(CHOOSEFONT);
242 chooseFont.hwndOwner = hWnd;
243 chooseFont.lpLogFont = &lfFont;
244 chooseFont.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_EFFECTS;
245 chooseFont.rgbColors = rgbColors;
246 chooseFont.nFontType = SCREEN_FONTTYPE;
247
248 if (::ChooseFont(&chooseFont) == TRUE) {
249 if (g_MenuData.hFont != NULL)
250 ::DeleteObject((HGDIOBJ) g_MenuData.hFont);
251 g_MenuData.crMenuTxt = chooseFont.rgbColors;
252 g_MenuData.lfFont = lfFont;
253 g_MenuData.hFont = ::CreateFontIndirect(&lfFont);
254 RedrawMenu(hWnd);
255 }
256
257 open = 0;
258
259 return TRUE;
260 }
261
262 /* ==========================================================================
263 Function Name : (BOOL) ExtractAssociatedIconEx()
264 Outline : �A�v���P�[�V���������A�t���������A�C�R�������������B
265 : ���������B
266 Arguments : char *szPath (In) �A�v���P�[�V������
267 : HICON *hLargeIcon (Out) �������A�C�R�����n���h��
268 : HICON *hSmallIcon (Out) �������A�C�R�����n���h��
269 Return Value : ���� TRUE
270 Reference :
271 Renewal :
272 Notes :
273 Attention :
274 Up Date :
275 ======1=========2=========3=========4=========5=========6=========7======= */
276 BOOL ExtractAssociatedIconEx(TCHAR *szPath, HICON *hLargeIcon, HICON *hSmallIcon)
277 {
278 SHFILEINFO sfi;
279
280 ::SHGetFileInfo(szPath, 0, &sfi, sizeof(sfi), SHGFI_LARGEICON | SHGFI_ICON);
281 *hLargeIcon = ::CopyIcon(sfi.hIcon);
282 ::DestroyIcon(sfi.hIcon);
283
284 ::SHGetFileInfo(szPath, 0, &sfi, sizeof(sfi), SHGFI_SMALLICON | SHGFI_ICON);
285 *hSmallIcon = ::CopyIcon(sfi.hIcon);
286 ::DestroyIcon(sfi.hIcon);
287
288 return TRUE;
289 }
290
291 /* ==========================================================================
292 Function Name : (BOOL) GetApplicationFilename()
293 Outline : ���W�X�g�������w���������������A�v���P�[�V������������
294 : �����B
295 Arguments : char *szName (In) ������
296 : char *szPath (Out) �A�v���P�[�V������
297 Return Value : ���� TRUE
298 Reference :
299 Renewal :
300 Notes :
301 Attention :
302 Up Date :
303 ======1=========2=========3=========4=========5=========6=========7======= */
304 BOOL GetApplicationFilename(char *szName, char *szPath)
305 {
306 char szSubKey[MAX_PATH];
307 char szDefault[MAX_PATH] = DEFAULT_PATH;
308
309 char szTTermPath[MAX_PATH];
310 BOOL bRet;
311 BOOL bTtssh = FALSE;
312 HKEY hKey;
313
314 ::wsprintf(szSubKey, "%s\\%s", TTERM_KEY, szName);
315 if ((hKey = RegOpen(HKEY_CURRENT_USER, szSubKey)) == INVALID_HANDLE_VALUE)
316 return FALSE;
317
318 bRet = RegGetStr(hKey, KEY_TERATERM, szPath, MAX_PATH);
319 if (bRet == FALSE || ::lstrlen(szPath) == 0) {
320 RegGetDword(hKey, KEY_TTSSH, (LPDWORD) &bTtssh);
321 ::GetProfileString("Tera Term Pro", "Path", szDefault, szTTermPath, MAX_PATH);
322 ::wsprintf(szPath, "%s\\%s", szTTermPath, TERATERM);
323 }
324
325 RegClose(hKey);
326
327 return TRUE;
328 }
329
330 /* ==========================================================================
331 Function Name : (BOOL) AddTooltip()
332 Outline : �w���������R���g���[�����c�[���`�b�v�����A�t����
333 Arguments : int idControl (In) �R���g���[��ID
334 Return Value : ���� TRUE / ���s FALSE
335 Reference :
336 Renewal :
337 Notes :
338 Attention :
339 Up Date :
340 ======1=========2=========3=========4=========5=========6=========7======= */
341 BOOL AddTooltip(int idControl)
342 {
343 TOOLINFO ti;
344
345 ti.cbSize = sizeof(TOOLINFO);
346 ti.uFlags = TTF_IDISHWND;
347 ti.hwnd = g_hWndMenu;
348 ti.uId = (UINT_PTR)::GetDlgItem(g_hWndMenu, idControl);
349 ti.hinst = 0;
350 ti.lpszText = LPSTR_TEXTCALLBACK;
351
352 return ::SendMessage(g_hWndTip, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
353 }
354
355 /* ==========================================================================
356 Function Name : (BOOL) LoadConfig()
357 Outline : ���W�X�g������TeraTerm Menu���\������������������
358 Arguments : ����
359 Return Value : ���� TRUE / ���s FALSE
360 Reference :
361 Renewal :
362 Notes :
363 Attention :
364 Up Date :
365 ======1=========2=========3=========4=========5=========6=========7======= */
366 BOOL LoadConfig(void)
367 {
368 HKEY hKey;
369 char uimsg[MAX_UIMSG];
370
371 if ((hKey = RegCreate(HKEY_CURRENT_USER, TTERM_KEY)) == INVALID_HANDLE_VALUE)
372 return FALSE;
373
374 if (RegGetDword(hKey, KEY_ICONMODE, &(g_MenuData.dwIconMode)) == TRUE) {
375 if (g_MenuData.dwIconMode == MODE_LARGEICON) {
376 UTIL_get_lang_msg("MENU_ICON", uimsg, sizeof(uimsg), STR_ICONMODE, UILanguageFile);
377 ::ModifyMenu(g_hConfigMenu, ID_ICON, MF_CHECKED | MF_BYCOMMAND, ID_ICON, uimsg);
378 }
379 } else
380 g_MenuData.dwIconMode = MODE_SMALLICON;
381
382 if (RegGetDword(hKey, KEY_LEFTBUTTONPOPUP, (LPDWORD) &(g_MenuData.bLeftButtonPopup)) == FALSE)
383 g_MenuData.bLeftButtonPopup = TRUE;
384 if (g_MenuData.bLeftButtonPopup == TRUE) {
385 UTIL_get_lang_msg("MENU_LEFTPOPUP", uimsg, sizeof(uimsg), STR_LEFTBUTTONPOPUP, UILanguageFile);
386 ::ModifyMenu(g_hConfigMenu, ID_LEFTPOPUP, MF_CHECKED | MF_BYCOMMAND, ID_LEFTPOPUP, uimsg);
387 }
388
389 if (RegGetDword(hKey, KEY_MENUTEXTCOLOR, &(g_MenuData.crMenuTxt)) == FALSE)
390 g_MenuData.crMenuTxt = ::GetSysColor(COLOR_MENUTEXT);
391
392 if (RegGetDword(hKey, KEY_HOTKEY, (LPDWORD) &(g_MenuData.bHotkey)) == FALSE)
393 g_MenuData.bHotkey = FALSE;
394 if (g_MenuData.bHotkey == TRUE) {
395 UTIL_get_lang_msg("MENU_HOTKEY", uimsg, sizeof(uimsg), STR_HOTKEY, UILanguageFile);
396 ::ModifyMenu(g_hConfigMenu, ID_HOTKEY, MF_CHECKED | MF_BYCOMMAND, ID_HOTKEY, uimsg);
397 ::RegisterHotKey(g_hWnd, WM_MENUOPEN, MOD_CONTROL | MOD_ALT, 'M');
398 }
399
400 if (RegGetDword(hKey, KEY_LF_HEIGHT, (DWORD *) &(g_MenuData.lfFont.lfHeight)) == TRUE) {
401 RegGetDword(hKey, KEY_LF_WIDTH, (DWORD *) &(g_MenuData.lfFont.lfWidth));
402 RegGetDword(hKey, KEY_LF_ESCAPEMENT, (DWORD *) &(g_MenuData.lfFont.lfEscapement));
403 RegGetDword(hKey, KEY_LF_ORIENTATION, (DWORD *) &(g_MenuData.lfFont.lfOrientation));
404 RegGetDword(hKey, KEY_LF_WEIGHT, (DWORD *) &(g_MenuData.lfFont.lfWeight));
405 RegGetDword(hKey, KEY_LF_ITALIC, (DWORD *) &(g_MenuData.lfFont.lfItalic));
406 RegGetDword(hKey, KEY_LF_UNDERLINE, (DWORD *) &(g_MenuData.lfFont.lfUnderline));
407 RegGetDword(hKey, KEY_LF_STRIKEOUT, (DWORD *) &(g_MenuData.lfFont.lfStrikeOut));
408 RegGetDword(hKey, KEY_LF_CHARSET, (DWORD *) &(g_MenuData.lfFont.lfCharSet));
409 RegGetDword(hKey, KEY_LF_OUTPRECISION, (DWORD *) &(g_MenuData.lfFont.lfOutPrecision));
410 RegGetDword(hKey, KEY_LF_CLIPPRECISION, (DWORD *) &(g_MenuData.lfFont.lfClipPrecision));
411 RegGetDword(hKey, KEY_LF_QUALITY, (DWORD *) &(g_MenuData.lfFont.lfQuality));
412 RegGetDword(hKey, KEY_LF_PITCHANDFAMILY, (DWORD *) &(g_MenuData.lfFont.lfPitchAndFamily));
413 RegGetStr(hKey, KEY_LF_FACENAME, g_MenuData.lfFont.lfFaceName, LF_FACESIZE);
414 } else
415 ::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &(g_MenuData.lfFont));
416
417 RegClose(hKey);
418
419 g_MenuData.crMenuBg = ::GetSysColor(COLOR_MENU);
420 g_MenuData.crSelMenuBg = ::GetSysColor(COLOR_HIGHLIGHT);
421 g_MenuData.crSelMenuTxt = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
422 g_MenuData.hFont = ::CreateFontIndirect(&(g_MenuData.lfFont));
423
424 return TRUE;
425 }
426
427 /* ==========================================================================
428 Function Name : (BOOL) SaveConfig()
429 Outline : ���W�X�g����TeraTerm Menu���\������������������
430 Arguments : ����
431 Return Value : ���� TRUE / ���s FALSE
432 Reference :
433 Renewal :
434 Notes :
435 Attention :
436 Up Date :
437 ======1=========2=========3=========4=========5=========6=========7======= */
438 BOOL SaveConfig(void)
439 {
440 HKEY hKey;
441
442 if ((hKey = RegOpen(HKEY_CURRENT_USER, TTERM_KEY)) == INVALID_HANDLE_VALUE)
443 return FALSE;
444
445 RegSetDword(hKey, KEY_ICONMODE, g_MenuData.dwIconMode);
446 RegSetDword(hKey, KEY_LEFTBUTTONPOPUP, g_MenuData.bLeftButtonPopup);
447 RegSetDword(hKey, KEY_HOTKEY, g_MenuData.bHotkey);
448 RegSetDword(hKey, KEY_MENUTEXTCOLOR, g_MenuData.crMenuTxt);
449 RegSetDword(hKey, KEY_LF_HEIGHT, g_MenuData.lfFont.lfHeight);
450 RegSetDword(hKey, KEY_LF_WIDTH, g_MenuData.lfFont.lfWidth);
451 RegSetDword(hKey, KEY_LF_ESCAPEMENT, g_MenuData.lfFont.lfEscapement);
452 RegSetDword(hKey, KEY_LF_ORIENTATION, g_MenuData.lfFont.lfOrientation);
453 RegSetDword(hKey, KEY_LF_WEIGHT, g_MenuData.lfFont.lfWeight);
454 RegSetDword(hKey, KEY_LF_ITALIC, g_MenuData.lfFont.lfItalic);
455 RegSetDword(hKey, KEY_LF_UNDERLINE, g_MenuData.lfFont.lfUnderline);
456 RegSetDword(hKey, KEY_LF_STRIKEOUT, g_MenuData.lfFont.lfStrikeOut);
457 RegSetDword(hKey, KEY_LF_CHARSET, g_MenuData.lfFont.lfCharSet);
458 RegSetDword(hKey, KEY_LF_OUTPRECISION, g_MenuData.lfFont.lfOutPrecision);
459 RegSetDword(hKey, KEY_LF_CLIPPRECISION, g_MenuData.lfFont.lfClipPrecision);
460 RegSetDword(hKey, KEY_LF_QUALITY, g_MenuData.lfFont.lfQuality);
461 RegSetDword(hKey, KEY_LF_PITCHANDFAMILY, g_MenuData.lfFont.lfPitchAndFamily);
462 RegSetStr(hKey, KEY_LF_FACENAME, g_MenuData.lfFont.lfFaceName);
463
464 RegClose(hKey);
465
466 return TRUE;
467 }
468
469 /* ==========================================================================
470 Function Name : (LRESULT CALLBACK) GetMsgProc()
471 Outline : �t�b�N �v���V�[�W���iGetMsgProc���w���v�Q���j
472 Arguments :
473 Return Value :
474 Reference :
475 Renewal :
476 Notes :
477 Attention :
478 Up Date :
479 ======1=========2=========3=========4=========5=========6=========7======= */
480 LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
481 {
482 MSG *lpMsg;
483
484 lpMsg = (MSG *) lParam;
485 if (nCode < 0 || !(::IsChild(g_hWndMenu, lpMsg->hwnd)))
486 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
487
488 switch (lpMsg->message) {
489 case WM_MOUSEMOVE:
490 case WM_LBUTTONDOWN:
491 case WM_LBUTTONUP:
492 case WM_RBUTTONDOWN:
493 case WM_RBUTTONUP:
494 if (g_hWndTip != NULL) {
495 MSG msg;
496 msg.lParam = lpMsg->lParam;
497 msg.wParam = lpMsg->wParam;
498 msg.message = lpMsg->message;
499 msg.hwnd = lpMsg->hwnd;
500 ::SendMessage(g_hWndTip, TTM_RELAYEVENT, 0, (LPARAM) (LPMSG) &msg);
501 }
502 break;
503 default:
504 break;
505 }
506
507 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
508 }
509
510 /* ==========================================================================
511 Function Name : (BOOL) CreateTooltip()
512 Outline : �c�[���`�b�v����������
513 Arguments : ����
514 Return Value : ���� TRUE / ���s FALSE
515 Reference :
516 Renewal :
517 Notes :
518 Attention :
519 Up Date :
520 ======1=========2=========3=========4=========5=========6=========7======= */
521 BOOL CreateTooltip(void)
522 {
523 ::InitCommonControls();
524
525 g_hWndTip = ::CreateWindowEx(0,
526 TOOLTIPS_CLASS,
527 (LPSTR) NULL,
528 TTS_ALWAYSTIP,
529 CW_USEDEFAULT,
530 CW_USEDEFAULT,
531 CW_USEDEFAULT,
532 CW_USEDEFAULT,
533 g_hWndMenu,
534 (HMENU) NULL,
535 g_hI,
536 NULL);
537
538 if (g_hWndTip == NULL)
539 return FALSE;
540
541 AddTooltip(BUTTON_SET);
542 AddTooltip(BUTTON_DELETE);
543 AddTooltip(BUTTON_ETC);
544 AddTooltip(CHECK_TTSSH);
545
546 g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE,
547 GetMsgProc,
548 (HINSTANCE) NULL,
549 ::GetCurrentThreadId());
550
551 if (g_hHook == (HHOOK) NULL)
552 return FALSE;
553
554 return TRUE;
555 }
556
557 /* ==========================================================================
558 Function Name : (BOOL) ManageWMNotify_Config()
559 Outline : �����_�C�A���O��WM_NOTIFY����������
560 Arguments : LPARAM lParam
561 Return Value : ���� TRUE / ������ FALSE
562 Reference :
563 Renewal :
564 Notes :
565 Attention :
566 Up Date :
567 ======1=========2=========3=========4=========5=========6=========7======= */
568 BOOL ManageWMNotify_Config(LPARAM lParam)
569 {
570 int idCtrl;
571 LPTOOLTIPTEXT lpttt;
572
573 if ((((LPNMHDR) lParam)->code) == TTN_NEEDTEXT) {
574 idCtrl = ::GetDlgCtrlID((HWND) ((LPNMHDR) lParam)->idFrom);
575 lpttt = (LPTOOLTIPTEXT) lParam;
576 switch (idCtrl) {
577 case BUTTON_SET:
578 lpttt->lpszText = "Register";
579 return TRUE;
580 case BUTTON_DELETE:
581 lpttt->lpszText = "Unregister";
582 return TRUE;
583 case BUTTON_ETC:
584 lpttt->lpszText = "Configure";
585 return TRUE;
586 case CHECK_TTSSH:
587 lpttt->lpszText = "use SSH";
588 return TRUE;
589 }
590 }
591
592 return FALSE;
593 }
594
595 /* ==========================================================================
596 Function Name : (void) PopupMenu()
597 Outline : ���C�����|�b�v�A�b�v���j���[���\�������B
598 Arguments : HWND hWnd (In) �e�E�C���h�E���n���h��
599 Return Value : ����
600 Reference :
601 Renewal :
602 Notes :
603 Attention :
604 Up Date :
605 ======1=========2=========3=========4=========5=========6=========7======= */
606 void PopupMenu(HWND hWnd)
607 {
608 POINT Point;
609
610 GetCursorPos(&Point);
611 ::SetForceForegroundWindow(hWnd);
612
613 // �}���`���j�^�������� LOWORD(), HIWORD() ���g���������������B(2005.10.13 yutaka)
614 ::TrackPopupMenu(g_hSubMenu,
615 TPM_LEFTALIGN | TPM_RIGHTBUTTON,
616 Point.x,
617 Point.y,
618 0,
619 hWnd,
620 NULL);
621 }
622
623 /* ==========================================================================
624 Function Name : (void) PopupListMenu()
625 Outline : �����������|�b�v�A�b�v���j���[���\�������B
626 Arguments : HWND hWnd (In) �e�E�C���h�E���n���h��
627 Return Value : ����
628 Reference :
629 Renewal :
630 Notes :
631 Attention :
632 Up Date :
633 ======1=========2=========3=========4=========5=========6=========7======= */
634 void PopupListMenu(HWND hWnd)
635 {
636 POINT Point;
637
638 GetCursorPos(&Point);
639 ::SetForceForegroundWindow(hWnd);
640
641 // �}���`���j�^�������� LOWORD(), HIWORD() ���g���������������B(2005.10.13 yutaka)
642 ::TrackPopupMenu(g_hListMenu,
643 TPM_LEFTALIGN | TPM_RIGHTBUTTON,
644 Point.x,
645 Point.y,
646 0,
647 hWnd,
648 NULL);
649 }
650
651 /* ==========================================================================
652 Function Name : (BOOL) InitListBox()
653 Outline : �����_�C�A���O���������������X�g�{�b�N�X�������������B
654 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
655 Return Value : ���� TRUE
656 Reference :
657 Renewal :
658 Notes :
659 Attention :
660 Up Date :
661 ======1=========2=========3=========4=========5=========6=========7======= */
662 BOOL InitListBox(HWND hWnd)
663 {
664 char szPath[MAX_PATH];
665 DWORD dwCnt = 0;
666 DWORD dwIndex = 0;
667
668 ::SendDlgItemMessage(hWnd, LIST_HOST, LB_RESETCONTENT, 0, 0);
669
670 while (::lstrlen(g_MenuData.szName[dwIndex]) != 0) {
671 if (GetApplicationFilename(g_MenuData.szName[dwIndex], szPath) == TRUE) {
672 ::SendDlgItemMessage(hWnd, LIST_HOST, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) g_MenuData.szName[dwIndex]);
673 ::SendDlgItemMessage(hWnd, LIST_HOST, LB_SETITEMDATA, (WPARAM) dwCnt, (LPARAM) dwIndex);
674 dwCnt++;
675 }
676 dwIndex++;
677 }
678
679 return TRUE;
680 }
681
682
683 void init_password_control(HWND dlg, int item)
684 {
685 HWND passwordControl = GetDlgItem(dlg, item);
686
687 SetWindowLongPtr(passwordControl, GWLP_USERDATA,
688 SetWindowLongPtr(passwordControl, GWLP_WNDPROC,
689 (LONG_PTR) password_wnd_proc));
690 }
691
692 /* ==========================================================================
693 Function Name : (BOOL) InitConfigDlg()
694 Outline : �����_�C�A���O�������������B
695 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
696 Return Value : ���� TRUE
697 Reference :
698 Renewal :
699 Notes :
700 Attention :
701 Up Date :
702 ======1=========2=========3=========4=========5=========6=========7======= */
703 BOOL InitConfigDlg(HWND hWnd)
704 {
705 HICON g_hIconLeft;
706 HICON g_hIconRight;
707 static const DlgTextInfo text_info[] = {
708 { 0, "DLG_CONFIG_TITLE" },
709 { LBL_LIST, "DLG_CONFIG_ITEM" },
710 { GRP_CONFIG, "DLG_CONFIG_CONFIG" },
711 { LBL_ENTRY, "DLG_CONFIG_NAME" },
712 { GRP_LAUNCH, "DLG_CONFIG_PATTERN" },
713 { RADIO_LOGIN, "DLG_CONFIG_AUTO" },
714 { LBL_HOST, "DLG_CONFIG_HOST" },
715 { CHECK_USER, "DLG_CONFIG_USER" },
716 { CHECK_PASSWORD, "DLG_CONFIG_PASS" },
717 { RADIO_MACRO, "DLG_CONFIG_MACRO" },
718 { RADIO_DIRECT, "DLG_CONFIG_LAUNCH" },
719 { CHECK_STARTUP, "DLG_CONFIG_STARTUP" },
720 { CHECK_TTSSH, "DLG_CONFIG_SSH" },
721 { IDC_KEYFILE_LABEL, "DLG_CONFIG_KEYFILE" },
722 { IDC_CHALLENGE_CHECK, "DLG_CONFIG_CHALLENGE" },
723 { IDC_PAGEANT_CHECK, "DLG_CONFIG_PAGEANT" },
724 { BUTTON_ETC, "DLG_CONFIG_DETAIL" },
725 };
726 SetI18nDlgStrsW(hWnd, "TTMenu", text_info, _countof(text_info), UILanguageFileW);
727
728 init_password_control(hWnd, EDIT_PASSWORD);
729
730 memset(&g_JobInfo, 0, sizeof(JobInfo));
731
732 ::DeleteMenu(::GetSystemMenu(hWnd, FALSE), SC_MAXIMIZE, MF_BYCOMMAND);
733 ::DeleteMenu(::GetSystemMenu(hWnd, FALSE), SC_SIZE, MF_BYCOMMAND);
734
735 g_hIconLeft = ::LoadIcon(g_hI, (LPCSTR)ICON_LEFT);
736 g_hIconRight = ::LoadIcon(g_hI, (LPCSTR)ICON_RIGHT);
737 ::SendDlgItemMessage(hWnd, BUTTON_SET, BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)(HANDLE) g_hIconLeft);
738 ::SendDlgItemMessage(hWnd, BUTTON_DELETE, BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)(HANDLE) g_hIconRight);
739
740 ::CheckRadioButton(hWnd, RADIO_LOGIN, RADIO_MACRO, RADIO_LOGIN);
741 EnableItem(hWnd, EDIT_MACRO, FALSE);
742 EnableItem(hWnd, BUTTON_MACRO, FALSE);
743 ::CheckDlgButton(hWnd, CHECK_USER, 1);
744 ::CheckDlgButton(hWnd, CHECK_PASSWORD, 1);
745 ::CheckDlgButton(hWnd, CHECK_INI_FILE, 1);
746
747 InitListBox(hWnd);
748
749 return TRUE;
750 }
751
752 /* ==========================================================================
753 Function Name : (BOOL) InitEtcDlg()
754 Outline : ���������_�C�A���O�������������B
755 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
756 Return Value : ���� TRUE
757 Reference :
758 Renewal :
759 Notes :
760 Attention :
761 Up Date :
762 ======1=========2=========3=========4=========5=========6=========7======= */
763 BOOL InitEtcDlg(HWND hWnd)
764 {
765 char szDefault[MAX_PATH] = DEFAULT_PATH;
766 char szTTermPath[MAX_PATH];
767
768 static const DlgTextInfo text_info[] = {
769 { 0, "DLG_ETC_TITLE" },
770 { LBL_TTMPATH, "DLG_ETC_APP" },
771 { LBL_OPTION, "DLG_ETC_OPTION" },
772 { GRP_INITFILE, "DLG_ETC_CONFIG" },
773 { GRP_AUTOLOGIN, "DLG_ETC_AUTO" },
774 { LBL_LOG, "DLG_ETC_LOGFILE" },
775 { GRP_PROMPT, "DLG_ETC_PROMPT" },
776 { LBL_PROMPT_USER, "DLG_ETC_USER" },
777 { LBL_PROMPT_PASS, "DLG_ETC_PASS" },
778 { BUTTON_DEFAULT, "BTN_DEFAULT" },
779 { IDOK, "BTN_OK" },
780 { IDCANCEL, "BTN_CANCEL" },
781 };
782 SetI18nDlgStrsW(hWnd, "TTMenu", text_info, _countof(text_info), UILanguageFileW);
783
784 if (::lstrlen(g_JobInfo.szTeraTerm) == 0) {
785 ::GetProfileString("Tera Term Pro", "Path", szDefault, szTTermPath, MAX_PATH);
786 ::wsprintf(g_JobInfo.szTeraTerm, "%s\\%s", szTTermPath, TERATERM);
787 }
788 if (g_JobInfo.bTtssh == TRUE && lstrstri(g_JobInfo.szTeraTerm, TERATERM) == NULL)
789 ::wsprintf(g_JobInfo.szTeraTerm, "%s\\%s", szTTermPath, TERATERM);
790 if (::lstrlen(g_JobInfo.szLoginPrompt) == 0) {
791 ::lstrcpy(g_JobInfo.szLoginPrompt, LOGIN_PROMPT);
792 }
793 if (::lstrlen(g_JobInfo.szPasswdPrompt) == 0) {
794 ::lstrcpy(g_JobInfo.szPasswdPrompt, PASSWORD_PROMPT);
795 }
796
797 ::SetDlgItemText(hWnd, EDIT_TTMPATH, g_JobInfo.szTeraTerm);
798 ::SetDlgItemText(hWnd, EDIT_INITFILE, g_JobInfo.szInitFile);
799 ::SetDlgItemText(hWnd, EDIT_OPTION, g_JobInfo.szOption);
800 ::SetDlgItemText(hWnd, EDIT_PROMPT_USER, g_JobInfo.szLoginPrompt);
801 ::SetDlgItemText(hWnd, EDIT_PROMPT_PASS, g_JobInfo.szPasswdPrompt);
802
803 ::SetDlgItemText(hWnd, EDIT_LOG, g_JobInfo.szLog);
804
805 return TRUE;
806 }
807
808 /* ==========================================================================
809 Function Name : (BOOL) InitVersionDlg()
810 Outline : �u�o�[�W���������v�_�C�A���O�������������B
811 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
812 Return Value : ���� TRUE
813 Reference :
814 Renewal :
815 Notes :
816 Attention :
817 Up Date :
818 ======1=========2=========3=========4=========5=========6=========7======= */
819 BOOL InitVersionDlg(HWND hWnd)
820 {
821 int a, b, c, d;
822 char app[_MAX_PATH];
823
824 ::DeleteMenu(::GetSystemMenu(hWnd, FALSE), SC_MAXIMIZE, MF_BYCOMMAND);
825 ::DeleteMenu(::GetSystemMenu(hWnd, FALSE), SC_SIZE, MF_BYCOMMAND);
826 ::DeleteMenu(::GetSystemMenu(hWnd, FALSE), SC_MINIMIZE, MF_BYCOMMAND);
827 ::DeleteMenu(::GetSystemMenu(hWnd, FALSE), SC_RESTORE, MF_BYCOMMAND);
828
829 GetModuleFileName(NULL, app, sizeof(app));
830 get_file_version(app, &a, &b, &c, &d);
831
832 wchar_t *app_name;
833 GetI18nStrWW("TTMenu", "DLG_ABOUT_APPNAME", L"launch tool", UILanguageFileW, &app_name);
834
835 wchar_t *ver_str_fmt;
836 hGetDlgItemTextW(hWnd, IDC_VERSION, &ver_str_fmt);
837 wchar_t *ver_str;
838 aswprintf(&ver_str, ver_str_fmt, app_name, a, b);
839 SetDlgItemTextW(hWnd, IDC_VERSION, ver_str);
840
841 free(app_name);
842 free(ver_str_fmt);
843 free(ver_str);
844
845 return TRUE;
846 }
847
848 /* ==========================================================================
849 Function Name : (BOOL) SetDefaultEtcDlg()
850 Outline : ���������_�C�A���O���e�������f�t�H���g�l�����������B
851 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
852 Return Value : ���� TRUE
853 Reference :
854 Renewal :
855 Notes :
856 Attention :
857 Up Date :
858 ======1=========2=========3=========4=========5=========6=========7======= */
859 BOOL SetDefaultEtcDlg(HWND hWnd)
860 {
861 char szDefault[MAX_PATH] = DEFAULT_PATH;
862 char szTTermPath[MAX_PATH];
863
864 ::GetProfileString("Tera Term Pro", "Path", szDefault, szTTermPath, MAX_PATH);
865 ::wsprintf(szTTermPath, "%s\\%s", szTTermPath, TERATERM);
866
867 ::SetDlgItemText(hWnd, EDIT_TTMPATH, szTTermPath);
868 ::SetDlgItemText(hWnd, EDIT_INITFILE, "");
869 // �f�t�H���g�I�v�V������ /KT , /KR ������ (2005.1.25 yutaka)
870 ::SetDlgItemText(hWnd, EDIT_OPTION, "/KT=UTF8 /KR=UTF8");
871 // ::SetDlgItemText(hWnd, EDIT_OPTION, "");
872 ::SetDlgItemText(hWnd, EDIT_PROMPT_USER, LOGIN_PROMPT);
873 ::SetDlgItemText(hWnd, EDIT_PROMPT_PASS, PASSWORD_PROMPT);
874
875 return TRUE;
876 }
877
878 /* ==========================================================================
879 Function Name : (BOOL) SetTaskTray()
880 Outline : �^�X�N�g���C���A�C�R�����o�^�^���������B
881 Arguments : HWND hWnd (In) �E�C���h�E���n���h��
882 : DWORD dwMessage (In) Shell_NotifyIcon����������
883 Return Value : ���� TRUE
884 Reference :
885 Renewal :
886 Notes :
887 Attention :
888 Up Date :
889 ======1=========2=========3=========4=========5=========6=========7======= */
890 BOOL SetTaskTray(HWND hWnd, DWORD dwMessage)
891 {
892 NOTIFYICONDATA nid;
893 int i;
894 BOOL ret;
895 DWORD ecode;
896
897 memset(&nid, 0, sizeof(nid));
898 nid.cbSize = sizeof(nid);
899 nid.hWnd = hWnd;
900 nid.uID = TTERM_ICON;
901 nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
902 nid.uCallbackMessage = WM_TMENU_NOTIFY;
903 nid.hIcon = g_hIconSmall;
904 lstrcpy(nid.szTip, "TeraTerm Menu");
905
906 /* Shell_NotifyIcon�������A�V�F�������o�^��4�b�������������������G���[�������������A
907 * ���g���C���������������B
908 *
909 * Microsoft�����������������AWindowsXP�`7���������Y�d�l�����l�BWindows8/8.1�����A
910 * ���g���C���s�v���v���������A�������u�������B
911 * cf. http://support.microsoft.com/kb/418138/ja
912 * (2014.6.21 yutaka)
913 */
914 if (dwMessage == NIM_ADD) {
915 for (i = 0 ; i < 10 ; i++) {
916 ret = ::Shell_NotifyIcon(dwMessage, &nid);
917 ecode = GetLastError();
918 if (ret == FALSE && ecode == ERROR_TIMEOUT) {
919 Sleep(1000);
920 ret = ::Shell_NotifyIcon(NIM_MODIFY, &nid);
921 if (ret == TRUE)
922 break;
923
924 } else {
925 break;
926 }
927 }
928
929 } else {
930 ::Shell_NotifyIcon(dwMessage, &nid);
931
932 }
933
934 return TRUE;
935 }
936
937 /* ==========================================================================
938 Function Name : (BOOL) MakeTTL()
939 Outline : �������O�C���p�}�N���t�@�C�������������B
940 Arguments : char *TTLName (In) �}�N���t�@�C����
941 : JobInfo JobInfo (In) ���������\����
942 Return Value : ���� TRUE / ���s FALSE
943 Reference :
944 Renewal :
945 Notes :
946 Attention :
947 Up Date :
948 ======1=========2=========3=========4=========5=========6=========7======= */
949 BOOL MakeTTL(char *TTLName, JobInfo *jobInfo)
950 {
951 char buf[1024];
952 DWORD dwWrite;
953 HANDLE hFile;
954
955 hFile = ::CreateFile(TTLName,
956 GENERIC_WRITE,
957 FILE_SHARE_WRITE | FILE_SHARE_READ,
958 NULL,
959 CREATE_ALWAYS,
960 FILE_ATTRIBUTE_NORMAL,
961 NULL);
962 if (hFile == INVALID_HANDLE_VALUE)
963 return FALSE;
964
965 ::wsprintf(buf, "filedelete '%s'\r\n", TTLName);
966 ::WriteFile(hFile, buf, ::lstrlen(buf), &dwWrite, NULL);
967
968 if (::lstrlen(jobInfo->szLog) != 0) {
969 ::wsprintf(buf, "logopen '%s' 0 1\r\n", jobInfo->szLog);
970 ::WriteFile(hFile, buf, ::lstrlen(buf), &dwWrite, NULL);
971 }
972
973 // telnet�|�[�g�������t������ (2004.12.3 yutaka)
974 ::wsprintf(buf, "connect '%s:23'\r\n", jobInfo->szHostName);
975 ::WriteFile(hFile, buf, ::lstrlen(buf), &dwWrite, NULL);
976
977 if (jobInfo->bUsername == TRUE) {
978 if (::lstrlen(jobInfo->szLoginPrompt) == 0)
979 ::lstrcpy(jobInfo->szLoginPrompt, LOGIN_PROMPT);
980 ::wsprintf(buf, "UsernamePrompt = '%s'\r\nUsername = '%s'\r\n", jobInfo->szLoginPrompt, jobInfo->szUsername);
981 ::WriteFile(hFile, buf, ::lstrlen(buf), &dwWrite, NULL);
982 }
983
984 if (jobInfo->bPassword == TRUE) {
985 if (::lstrlen(jobInfo->szPasswdPrompt) == 0)
986 ::lstrcpy(jobInfo->szPasswdPrompt, PASSWORD_PROMPT);
987 ::wsprintf(buf, "PasswordPrompt = '%s'\r\nPassword = '%s'\r\n", jobInfo->szPasswdPrompt, jobInfo->szPassword);
988 ::WriteFile(hFile, buf, ::lstrlen(buf), &dwWrite, NULL);
989 }
990
991 if (jobInfo->bUsername == TRUE) {
992 ::wsprintf(buf, "wait UsernamePrompt\r\nsendln Username\r\n");
993 ::WriteFile(hFile, buf, ::lstrlen(buf), &dwWrite, NULL);
994 }
995
996 if (jobInfo->bPassword == TRUE) {
997 ::wsprintf(buf, "wait PasswordPrompt\r\nsendln Password\r\n");
998 ::WriteFile(hFile, buf, ::lstrlen(buf), &dwWrite, NULL);
999 }
1000
1001 ::CloseHandle(hFile);
1002
1003 return TRUE;
1004 }
1005
1006
1007 static void _dquote_string(char *str, char *dst, int dst_len)
1008 {
1009 int i, len, n;
1010
1011 len = strlen(str);
1012 n = 0;
1013 for (i = 0 ; i < len ; i++) {
1014 if (str[i] == '"')
1015 n++;
1016 }
1017 if (dst_len < (len + 2*n + 2 + 1))
1018 return;
1019
1020 *dst++ = '"';
1021 for (i = 0 ; i < len ; i++) {
1022 if (str[i] == '"') {
1023 *dst++ = '"';
1024 *dst++ = '"';
1025
1026 } else {
1027 *dst++ = str[i];
1028
1029 }
1030 }
1031 *dst++ = '"';
1032 *dst = '\0';
1033 }
1034
1035 static void dquote_string(char *str, char *dst, int dst_len)
1036 {
1037 // ",�X�y�[�X,;,^A-^_ �������������������N�I�[�g����
1038 if (strchr(str, '"') != NULL ||
1039 strchr(str, ' ') != NULL ||
1040 strchr(str, ';') != NULL ||
1041 strchr(str, 0x01) != NULL ||
1042 strchr(str, 0x02) != NULL ||
1043 strchr(str, 0x03) != NULL ||
1044 strchr(str, 0x04) != NULL ||
1045 strchr(str, 0x05) != NULL ||
1046 strchr(str, 0x06) != NULL ||
1047 strchr(str, 0x07) != NULL ||
1048 strchr(str, 0x08) != NULL ||
1049 strchr(str, 0x09) != NULL ||
1050 strchr(str, 0x0a) != NULL ||
1051 strchr(str, 0x0b) != NULL ||
1052 strchr(str, 0x0c) != NULL ||
1053 strchr(str, 0x0d) != NULL ||
1054 strchr(str, 0x0e) != NULL ||
1055 strchr(str, 0x0f) != NULL ||
1056 strchr(str, 0x10) != NULL ||
1057 strchr(str, 0x11) != NULL ||
1058 strchr(str, 0x12) != NULL ||
1059 strchr(str, 0x13) != NULL ||
1060 strchr(str, 0x14) != NULL ||
1061 strchr(str, 0x15) != NULL ||
1062 strchr(str, 0x16) != NULL ||
1063 strchr(str, 0x17) != NULL ||
1064 strchr(str, 0x18) != NULL ||
1065 strchr(str, 0x19) != NULL ||
1066 strchr(str, 0x1a) != NULL ||
1067 strchr(str, 0x1b) != NULL ||
1068 strchr(str, 0x1c) != NULL ||
1069 strchr(str, 0x1d) != NULL ||
1070 strchr(str, 0x1e) != NULL ||
1071 strchr(str, 0x1f) != NULL) {
1072 _dquote_string(str, dst, dst_len);
1073 return;
1074 }
1075 // ���������R�s�[��������
1076 strncpy_s(dst, dst_len, str, _TRUNCATE);
1077 }
1078
1079 /* ==========================================================================
1080 Function Name : (BOOL) ConnectHost()
1081 Outline : �������O�C���������A�v���P�[�V���������s�������B
1082 Arguments : HWND hWnd (In) �E�C���h�E���n���h��
1083 : UINT idItem (In) �I���������R���g���[��ID
1084 : char *szJobName (In) ���s�����W���u
1085 Return Value : ���� TRUE / ���s FALSE
1086 Reference :
1087 Renewal :
1088 Notes :
1089 Attention :
1090 Up Date :
1091 ======1=========2=========3=========4=========5=========6=========7======= */
1092 BOOL ConnectHost(HWND hWnd, UINT idItem, char *szJobName)
1093 {
1094 char szName[MAX_PATH];
1095 char szDefault[MAX_PATH] = DEFAULT_PATH;
1096
1097 char szDirectory[MAX_PATH];
1098 char szHostName[MAX_PATH];
1099 char szTempPath[MAX_PATH];
1100 char szMacroFile[MAX_PATH];
1101 // https://learn.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/command-line-string-limitation
1102 char szArgment[8192] = "";
1103 char szTemp[8192];
1104 char *pHostName;
1105 TCHAR *pt;
1106 JobInfo jobInfo;
1107 char cur[MAX_PATH], modulePath[MAX_PATH], fullpath[MAX_PATH];
1108
1109 DWORD dwErr;
1110 char uimsg[MAX_UIMSG];
1111
1112 ::lstrcpy(szName, (szJobName == NULL) ? g_MenuData.szName[idItem - ID_MENU_MIN] : szJobName);
1113
1114 if (RegLoadLoginHostInformation(szName, &jobInfo) == FALSE) {
1115 dwErr = ::GetLastError();
1116 UTIL_get_lang_msg("MSG_ERROR_MAKETTL", uimsg, sizeof(uimsg),
1117 "Couldn't read the registry data.\n", UILanguageFile);
1118 ErrorMessage(hWnd, dwErr, uimsg);
1119 return FALSE;
1120 }
1121
1122 if (szJobName != NULL && jobInfo.bStartup == FALSE)
1123 return TRUE;
1124
1125 if (::lstrlen(jobInfo.szTeraTerm) == 0) {
1126 ::GetProfileString("Tera Term Pro", "Path", szDefault, jobInfo.szTeraTerm, MAX_PATH);
1127 ::wsprintf(jobInfo.szTeraTerm, "%s\\%s", jobInfo.szTeraTerm, TERATERM);
1128 }
1129
1130 ::lstrcpy(szHostName, jobInfo.szHostName);
1131 if ((pHostName = _tcstok(szHostName, _T(" ([{'\"|*"))) != NULL)
1132 pHostName = szHostName;
1133
1134 if (jobInfo.dwMode != MODE_DIRECT)
1135 if (::lstrlen(jobInfo.szInitFile) != 0) {
1136 _snprintf_s(szTemp, sizeof(szTemp), _TRUNCATE, "/F=\"%s\"", jobInfo.szInitFile);
1137 strncat_s(szArgment, sizeof(szArgment), szTemp, _TRUNCATE);
1138 }
1139
1140 switch (jobInfo.dwMode) {
1141 case MODE_AUTOLOGIN:
1142 ::GetTempPath(MAX_PATH, szTempPath);
1143 ::GetTempFileName(szTempPath, "ttm", 0, szMacroFile);
1144 if (MakeTTL(szMacroFile, &jobInfo) == FALSE) {
1145 dwErr = ::GetLastError();
1146 UTIL_get_lang_msg("MSG_ERROR_MAKETTL", uimsg, sizeof(uimsg),
1147 "Could not make 'ttpmenu.TTL'\n", UILanguageFile);
1148 ErrorMessage(hWnd, dwErr, uimsg);
1149 return FALSE;
1150 }
1151 break;
1152 case MODE_MACRO:
1153 ::lstrcpy(szMacroFile, jobInfo.szMacroFile);
1154 break;
1155 }
1156
1157 // SSH�������O�C�����������}�N�����s�v
1158 if (jobInfo.bTtssh != TRUE) {
1159 if (jobInfo.dwMode != MODE_DIRECT) {
1160 _snprintf_s(szTemp, sizeof(szTemp), _TRUNCATE, " /M=\"%s\"", szMacroFile);
1161 strncat_s(szArgment, sizeof(szArgment), szTemp, _TRUNCATE);
1162 }
1163 }
1164
1165 if (::lstrlen(jobInfo.szOption) != 0) {
1166 _snprintf_s(szTemp, sizeof(szTemp), _TRUNCATE, " %s", jobInfo.szOption);
1167 strncat_s(szArgment, sizeof(szArgment), szTemp, _TRUNCATE);
1168 }
1169
1170 // TTSSH���L�����������A�������O�C�����������R�}���h���C�����t�������B
1171 if (jobInfo.dwMode == MODE_AUTOLOGIN) {
1172 if (jobInfo.bTtssh == TRUE) {
1173 char passwd[MAX_PATH], keyfile[MAX_PATH];
1174
1175 strncpy_s(szTemp, sizeof(szTemp), szArgment, _TRUNCATE);
1176 dquote_string(jobInfo.szPassword, passwd, sizeof(passwd));
1177 dquote_string(jobInfo.PrivateKeyFile, keyfile, sizeof(keyfile));
1178
1179 if (jobInfo.bChallenge) { // keyboard-interactive
1180 _snprintf_s(szArgment, sizeof(szArgment), _TRUNCATE,
1181 "%s:22 /ssh /auth=challenge /user=%s /passwd=%s %s",
1182 jobInfo.szHostName,
1183 jobInfo.szUsername,
1184 passwd,
1185 szTemp
1186 );
1187
1188 } else if (jobInfo.bPageant) { // Pageant
1189 _snprintf_s(szArgment, sizeof(szArgment), _TRUNCATE,
1190 "%s:22 /ssh /auth=pageant /user=%s %s",
1191 jobInfo.szHostName,
1192 jobInfo.szUsername,
1193 szTemp
1194 );
1195
1196 } else if (jobInfo.PrivateKeyFile[0] == NULL) { // password authentication
1197 _snprintf_s(szArgment, sizeof(szArgment), _TRUNCATE,
1198 "%s:22 /ssh /auth=password /user=%s /passwd=%s %s",
1199 jobInfo.szHostName,
1200 jobInfo.szUsername,
1201 passwd,
1202 szTemp
1203 );
1204
1205 } else { // publickey
1206 _snprintf_s(szArgment, sizeof(szArgment), _TRUNCATE,
1207 "%s:22 /ssh /auth=publickey /user=%s /passwd=%s /keyfile=%s %s",
1208 jobInfo.szHostName,
1209 jobInfo.szUsername,
1210 passwd,
1211 keyfile,
1212 szTemp
1213 );
1214
1215 }
1216
1217 } else {
1218 // SSH���g�����������A/nossh �I�v�V�������t���������B
1219 strncpy_s(szArgment, sizeof(szArgment), " /nossh", _TRUNCATE);
1220 }
1221 }
1222
1223 // �t���p�X������
1224 GetCurrentDirectory(sizeof(cur), cur);
1225 GetModuleFileName(NULL, modulePath, sizeof(modulePath));
1226 ExtractDirName(modulePath, modulePath);
1227 SetCurrentDirectory(modulePath);
1228 _fullpath(fullpath, jobInfo.szTeraTerm, sizeof(fullpath));
1229 ::lstrcpy(jobInfo.szTeraTerm, fullpath);
1230
1231 ::lstrcpy(szDirectory, jobInfo.szTeraTerm);
1232 if ((::GetFileAttributes(jobInfo.szTeraTerm) & FILE_ATTRIBUTE_DIRECTORY) == 0)
1233 if ((pt = _tcsrchr(szDirectory, '\\')) != NULL)
1234 *pt = '\0';
1235
1236 SHELLEXECUTEINFO ExecInfo;
1237 memset((void *) &ExecInfo, 0, sizeof(SHELLEXECUTEINFO));
1238 ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
1239 ExecInfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
1240 ExecInfo.hwnd = hWnd;
1241 ExecInfo.lpVerb = (LPCSTR) NULL;
1242 ExecInfo.lpFile = (LPCSTR) jobInfo.szTeraTerm;
1243 ExecInfo.lpParameters = (LPCSTR) szArgment;
1244 ExecInfo.lpDirectory = (LPCSTR) szDirectory;
1245 ExecInfo.nShow = SW_SHOWNORMAL;
1246 ExecInfo.hInstApp = g_hI;
1247
1248 if (::ShellExecuteEx(&ExecInfo) == FALSE) {
1249 dwErr = ::GetLastError();
1250 UTIL_get_lang_msg("MSG_ERROR_LAUNCH", uimsg, sizeof(uimsg),
1251 "Launching the application was failure.\n", UILanguageFile);
1252 ErrorMessage(hWnd, dwErr, uimsg);
1253 ::DeleteFile(szTempPath);
1254 }
1255
1256 if (::lstrlen(jobInfo.szLog) != 0) {
1257 Sleep(500);
1258 HWND hLog = ::FindWindow(NULL, "Tera Term: Log");
1259 if (hLog != NULL)
1260 ShowWindow(hLog, SW_HIDE);
1261 }
1262
1263 SetCurrentDirectory(cur);
1264
1265 return TRUE;
1266 }
1267
1268 /* ==========================================================================
1269 Function Name : (BOOL) InitMenu()
1270 Outline : �e�|�b�v�A�b�v���j���[�����������B
1271 Arguments : ����
1272 Return Value : ���� TRUE / ���s FALSE
1273 Reference :
1274 Renewal :
1275 Notes :
1276 Attention :
1277 Up Date :
1278 ======1=========2=========3=========4=========5=========6=========7======= */
1279 BOOL InitMenu(void)
1280 {
1281 char uimsg[MAX_UIMSG];
1282
1283 for (int cnt = 0; cnt < MAXJOBNUM; cnt++) {
1284 g_MenuData.hLargeIcon[cnt] = NULL;
1285 g_MenuData.hSmallIcon[cnt] = NULL;
1286 }
1287
1288 if (g_hListMenu == NULL) {
1289 g_hMenu = ::LoadMenu(g_hI, (LPCSTR) TTERM_MENU);
1290 g_hSubMenu = ::GetSubMenu(g_hMenu, 0);
1291 g_hListMenu = ::CreateMenu();
1292 g_hConfigMenu = ::GetSubMenu(g_hSubMenu, 1);
1293 if (g_hMenu == NULL || g_hSubMenu == NULL || g_hListMenu == NULL)
1294 return FALSE;
1295
1296 static const DlgTextInfo SubMenuTextInfo[] = {
1297 ID_TMENU_ADD, "MENU_LISTCONFIG",
1298 1, "MENU_SETTING",
1299 ID_VERSION, "MENU_VERSION",
1300 ID_EXEC, "MENU_EXEC",
1301 ID_TMENU_CLOSE, "MENU_CLOSE",
1302 };
1303 SetI18nMenuStrsW(g_hSubMenu, "TTMenu", SubMenuTextInfo, _countof(SubMenuTextInfo), UILanguageFileW);
1304
1305 static const DlgTextInfo ConfigMenuTextInfo[] = {
1306 ID_ICON, "MENU_ICON",
1307 ID_FONT, "MENU_FONT",
1308 ID_LEFTPOPUP, "MENU_LEFTPOPUP",
1309 ID_HOTKEY, "MENU_HOTKEY",
1310 };
1311 SetI18nMenuStrsW(g_hConfigMenu, "TTMenu", ConfigMenuTextInfo, _countof(ConfigMenuTextInfo), UILanguageFileW);
1312 UTIL_get_lang_msg("MENU_EXEC", uimsg, sizeof(uimsg), "Execute", UILanguageFile);
1313 ::ModifyMenu(g_hSubMenu, ID_EXEC, MF_BYCOMMAND | MF_POPUP, (UINT_PTR)g_hListMenu, (LPCTSTR) uimsg);
1314 }
1315
1316 return TRUE;
1317 }
1318
1319 /* ==========================================================================
1320 Function Name : (VOID) DeleteListMenuIcons()
1321 Outline : SHGetFileInfo �������o�����A�C�R�����\�[�X���J�������B
1322 �|�b�v�A�b�v���j���[�������\�����g�p���������A
1323 �J�����������������X�V���O���v���O�����I�����B
1324 Arguments :
1325 Return Value :
1326 Reference :
1327 Renewal :
1328 Notes :
1329 Attention :
1330 Up Date :
1331 ======1=========2=========3=========4=========5=========6=========7======= */
1332 VOID DeleteListMenuIcons()
1333 {
1334 for (int cnt = 0; cnt < MAXJOBNUM; cnt++) {
1335 memset(g_MenuData.szName, 0, MAX_PATH);
1336 if (g_MenuData.hLargeIcon[cnt] != NULL) {
1337 ::DestroyIcon(g_MenuData.hLargeIcon[cnt]);
1338 g_MenuData.hLargeIcon[cnt] = NULL;
1339 }
1340 if (g_MenuData.hSmallIcon[cnt] != NULL) {
1341 ::DestroyIcon(g_MenuData.hSmallIcon[cnt]);
1342 g_MenuData.hSmallIcon[cnt] = NULL;
1343 }
1344 }
1345 }
1346
1347 /* ==========================================================================
1348 Function Name : (BOOL) InitListMenu()
1349 Outline : ���������|�b�v�A�b�v���j���[�������������B
1350 Arguments : HWND hWnd (In) �E�C���h�E���n���h��
1351 Return Value : ���� TRUE
1352 Reference :
1353 Renewal :
1354 Notes :
1355 Attention :
1356 Up Date :
1357 ======1=========2=========3=========4=========5=========6=========7======= */
1358 BOOL InitListMenu(HWND hWnd)
1359 {
1360 char szPath[MAX_PATH];
1361 char szEntryName[MAX_PATH];
1362 HKEY hKey;
1363 DWORD dwCnt;
1364 DWORD dwIndex = 0;
1365 DWORD dwSize = MAX_PATH;
1366
1367 DeleteListMenuIcons();
1368
1369 if ((hKey = RegOpen(HKEY_CURRENT_USER, TTERM_KEY)) != INVALID_HANDLE_VALUE) {
1370 while (RegEnumEx(hKey, dwIndex, szEntryName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
1371 ::lstrcpy(g_MenuData.szName[dwIndex++], szEntryName);
1372 dwSize = MAX_PATH;
1373 }
1374 ::lstrcpy(g_MenuData.szName[dwIndex], "");
1375 RegClose(hKey);
1376
1377 for (dwCnt = 0; dwCnt < dwIndex; dwCnt++)
1378 if (GetApplicationFilename(g_MenuData.szName[dwCnt], szPath) == TRUE)
1379 ExtractAssociatedIconEx(szPath, &g_MenuData.hLargeIcon[dwCnt], &g_MenuData.hSmallIcon[dwCnt]);
1380 }
1381
1382 RedrawMenu(hWnd);
1383
1384 return TRUE;
1385 }
1386
1387 /* ==========================================================================
1388 Function Name : (BOOL) RedrawMenu()
1389 Outline : ���������|�b�v�A�b�v���j���[���`�������B
1390 Arguments : HWND hWnd (In) �E�C���h�E���n���h��
1391 Return Value : ���� TRUE
1392 Reference :
1393 Renewal :
1394 Notes :
1395 Attention :
1396 Up Date :
1397 ======1=========2=========3=========4=========5=========6=========7======= */
1398 BOOL RedrawMenu(HWND hWnd)
1399 {
1400 int num;
1401 char szPath[MAX_PATH];
1402 HDC hDC;
1403 HWND hWndItem;
1404 DWORD itemNum;
1405 DWORD desktopHeight;
1406 DWORD dwCnt = 0;
1407 DWORD dwValidCnt = 0;
1408 TEXTMETRIC textMetric;
1409 char uimsg[MAX_UIMSG];
1410
1411 ::DeleteMenu(g_hListMenu, ID_NOENTRY, MF_BYCOMMAND);
1412 num = ::GetMenuItemCount(g_hListMenu);
1413 for (dwCnt = 0; dwCnt < (DWORD) num; dwCnt++)
1414 if (::DeleteMenu(g_hListMenu, ID_MENU_MIN + dwCnt, MF_BYCOMMAND) == FALSE)
1415 num++;
1416
1417 hWndItem = ::GetDlgItem((HWND) g_hListMenu, ID_MENU_MIN);
1418 hDC = ::GetWindowDC(hWndItem);
1419 if (g_MenuData.hFont != NULL)
1420 ::SelectObject(hDC, (HGDIOBJ) g_MenuData.hFont);
1421 ::GetTextMetrics(hDC, &textMetric);
1422 if (g_MenuData.dwIconMode == MODE_SMALLICON)
1423 g_MenuData.dwMenuHeight = (ICONSPACE_SMALL > textMetric.tmHeight) ? ICONSPACE_SMALL : textMetric.tmHeight;
1424 else
1425 g_MenuData.dwMenuHeight = (ICONSPACE_LARGE > textMetric.tmHeight) ? ICONSPACE_LARGE : textMetric.tmHeight;
1426 ReleaseDC(hWndItem, hDC);
1427
1428 desktopHeight = ::GetSystemMetrics(SM_CYSCREEN);
1429 itemNum = desktopHeight / g_MenuData.dwMenuHeight;
1430
1431 dwCnt = 0;
1432 while (::lstrlen(g_MenuData.szName[dwCnt]) != 0) {
1433 if (GetApplicationFilename(g_MenuData.szName[dwCnt], szPath) == TRUE) {
1434 if (dwCnt % itemNum == 0 && dwCnt != 0)
1435 ::AppendMenu(g_hListMenu, MF_OWNERDRAW | MF_MENUBARBREAK, ID_MENU_MIN + dwCnt, (LPCTSTR) dwCnt);
1436 else
1437 ::AppendMenu(g_hListMenu, MF_OWNERDRAW | MF_POPUP, ID_MENU_MIN + dwCnt, (LPCTSTR) dwCnt);
1438 dwValidCnt++;
1439 }
1440 dwCnt++;
1441 }
1442 if (dwValidCnt == 0) {
1443 UTIL_get_lang_msg("MENU_NOTRAY", uimsg, sizeof(uimsg), STR_NOENTRY, UILanguageFile);
1444 ::AppendMenu(g_hListMenu, MF_STRING | MF_GRAYED, ID_NOENTRY, (LPCTSTR) uimsg);
1445 }
1446
1447 return TRUE;
1448 }
1449
1450 /* ==========================================================================
1451 Function Name : (BOOL) RegSaveLoginHostInformation()
1452 Outline : ���W�X�g�����������������������B
1453 Arguments : JobInfo *jobInfo (In) ���������\����
1454 Return Value : ���� TRUE / ���s FALSE
1455 Reference :
1456 Renewal :
1457 Notes :
1458 Attention :
1459 Up Date :
1460 ======1=========2=========3=========4=========5=========6=========7======= */
1461 BOOL RegSaveLoginHostInformation(JobInfo *jobInfo)
1462 {
1463 HKEY hKey;
1464 char szSubKey[MAX_PATH];
1465 char szEncodePassword[MAX_PATH];
1466
1467 ::wsprintf(szSubKey, "%s\\%s", TTERM_KEY, jobInfo->szName);
1468 if ((hKey = RegCreate(HKEY_CURRENT_USER, szSubKey)) == INVALID_HANDLE_VALUE)
1469 return FALSE;
1470
1471 RegSetStr(hKey, KEY_HOSTNAME, jobInfo->szHostName);
1472 RegSetDword(hKey, KEY_MODE, jobInfo->dwMode);
1473
1474 RegSetDword(hKey, KEY_USERFLAG, (DWORD) jobInfo->bUsername);
1475 RegSetStr(hKey, KEY_USERNAME, jobInfo->szUsername);
1476 RegSetDword(hKey, KEY_PASSWDFLAG, (DWORD) jobInfo->bPassword);
1477 EncodePassword(jobInfo->szPassword, szEncodePassword);
1478 RegSetBinary(hKey, KEY_PASSWORD, szEncodePassword, ::lstrlen(szEncodePassword) + 1);
1479
1480 RegSetStr(hKey, KEY_TERATERM, jobInfo->szTeraTerm);
1481 RegSetStr(hKey, KEY_INITFILE, jobInfo->szInitFile);
1482 RegSetStr(hKey, KEY_OPTION, jobInfo->szOption);
1483 RegSetStr(hKey, KEY_LOGIN_PROMPT, jobInfo->szLoginPrompt);
1484 RegSetStr(hKey, KEY_PASSWORD_PROMPT, jobInfo->szPasswdPrompt);
1485
1486 RegSetStr(hKey, KEY_MACROFILE, jobInfo->szMacroFile);
1487
1488 RegSetDword(hKey, KEY_TTSSH, (DWORD) jobInfo->bTtssh);
1489 RegSetDword(hKey, KEY_STARTUP, (DWORD) jobInfo->bStartup);
1490
1491 RegSetStr(hKey, KEY_LOG, jobInfo->szLog);
1492
1493 // SSH2
1494 RegSetStr(hKey, KEY_KEYFILE, jobInfo->PrivateKeyFile);
1495 RegSetDword(hKey, KEY_CHALLENGE, (DWORD) jobInfo->bChallenge);
1496 RegSetDword(hKey, KEY_PAGEANT, (DWORD) jobInfo->bPageant);
1497
1498 RegClose(hKey);
1499
1500 return TRUE;
1501 }
1502
1503 /* ==========================================================================
1504 Function Name : (BOOL) RegLoadLoginHostInformation()
1505 Outline : ���W�X�g�������������������������B
1506 Arguments : char *szName (In) ����������
1507 : JobInfo *jobInfo (In) ���������\����
1508 Return Value : ���� TRUE / ���s FALSE
1509 Reference :
1510 Renewal :
1511 Notes :
1512 Attention :
1513 Up Date :
1514 ======1=========2=========3=========4=========5=========6=========7======= */
1515 BOOL RegLoadLoginHostInformation(char *szName, JobInfo *job_Info)
1516 {
1517 HKEY hKey;
1518 char szSubKey[MAX_PATH];
1519 char szEncodePassword[MAX_PATH];
1520 DWORD dwSize = MAX_PATH;
1521 JobInfo jobInfo;
1522
1523 memset(&jobInfo, 0, sizeof(JobInfo));
1524
1525 ::wsprintf(szSubKey, "%s\\%s", TTERM_KEY, szName);
1526 if ((hKey = RegOpen(HKEY_CURRENT_USER, szSubKey)) == INVALID_HANDLE_VALUE)
1527 return FALSE;
1528
1529 ::lstrcpy(jobInfo.szName, szName);
1530
1531 RegGetStr(hKey, KEY_HOSTNAME, jobInfo.szHostName, MAX_PATH);
1532 RegGetDword(hKey, KEY_MODE, &(jobInfo.dwMode));
1533
1534 RegGetDword(hKey, KEY_USERFLAG, (DWORD *) &(jobInfo.bUsername));
1535 RegGetStr(hKey, KEY_USERNAME, jobInfo.szUsername, MAX_PATH);
1536 RegGetDword(hKey, KEY_PASSWDFLAG, (DWORD *) &(jobInfo.bPassword));
1537 RegGetBinary(hKey, KEY_PASSWORD, szEncodePassword, &dwSize);
1538 EncodePassword(szEncodePassword, jobInfo.szPassword);
1539
1540 RegGetStr(hKey, KEY_TERATERM, jobInfo.szTeraTerm, MAX_PATH);
1541 RegGetStr(hKey, KEY_INITFILE, jobInfo.szInitFile, MAX_PATH);
1542 RegGetStr(hKey, KEY_OPTION, jobInfo.szOption, MAX_PATH);
1543 RegGetStr(hKey, KEY_LOGIN_PROMPT, jobInfo.szLoginPrompt, MAX_PATH);
1544 RegGetStr(hKey, KEY_PASSWORD_PROMPT, jobInfo.szPasswdPrompt, MAX_PATH);
1545
1546 RegGetStr(hKey, KEY_MACROFILE, jobInfo.szMacroFile, MAX_PATH);
1547
1548 RegGetDword(hKey, KEY_TTSSH, (LPDWORD) &(jobInfo.bTtssh));
1549 RegGetDword(hKey, KEY_STARTUP, (LPDWORD) &(jobInfo.bStartup));
1550
1551 RegGetStr(hKey, KEY_LOG, jobInfo.szLog, MAX_PATH);
1552
1553 // SSH2
1554 ZeroMemory(jobInfo.PrivateKeyFile, sizeof(jobInfo.PrivateKeyFile));
1555 RegGetStr(hKey, KEY_KEYFILE, jobInfo.PrivateKeyFile, MAX_PATH);
1556 RegGetDword(hKey, KEY_CHALLENGE, (LPDWORD) &(jobInfo.bChallenge));
1557 RegGetDword(hKey, KEY_PAGEANT, (LPDWORD) &(jobInfo.bPageant));
1558
1559 RegClose(hKey);
1560
1561 *job_Info = jobInfo;
1562
1563 return TRUE;
1564 }
1565
1566 /* ==========================================================================
1567 Function Name : (BOOL) SaveEtcInformation()
1568 Outline : ���������������O���[�o�����������������B
1569 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
1570 Return Value : ���� TRUE / ���s FALSE
1571 Reference :
1572 Renewal :
1573 Notes :
1574 Attention :
1575 Up Date :
1576 ======1=========2=========3=========4=========5=========6=========7======= */
1577 BOOL SaveEtcInformation(HWND hWnd)
1578 {
1579 ::GetDlgItemText(hWnd, EDIT_TTMPATH, g_JobInfo.szTeraTerm, MAX_PATH);
1580 ::GetDlgItemText(hWnd, EDIT_INITFILE, g_JobInfo.szInitFile, MAX_PATH);
1581 ::GetDlgItemText(hWnd, EDIT_OPTION, g_JobInfo.szOption, MAX_PATH);
1582 ::GetDlgItemText(hWnd, EDIT_PROMPT_USER, g_JobInfo.szLoginPrompt, MAX_PATH);
1583 ::GetDlgItemText(hWnd, EDIT_PROMPT_PASS, g_JobInfo.szPasswdPrompt, MAX_PATH);
1584
1585 ::GetDlgItemText(hWnd, EDIT_LOG, g_JobInfo.szLog, MAX_PATH);
1586
1587 return TRUE;
1588 }
1589
1590 /* ==========================================================================
1591 Function Name : (BOOL) SaveLoginHostInformation()
1592 Outline : �������������������B
1593 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
1594 Return Value : ���� TRUE / ���s FALSE
1595 Reference :
1596 Renewal :
1597 Notes :
1598 Attention :
1599 Up Date :
1600 ======1=========2=========3=========4=========5=========6=========7======= */
1601 BOOL SaveLoginHostInformation(HWND hWnd)
1602 {
1603 long index;
1604 char szDefault[MAX_PATH] = DEFAULT_PATH;
1605 char szTTermPath[MAX_PATH];
1606 char szName[MAX_PATH];
1607 DWORD dwErr;
1608 char uimsg[MAX_UIMSG];
1609 char cur[MAX_PATH], modulePath[MAX_PATH];
1610
1611 if (::GetDlgItemText(hWnd, EDIT_ENTRY, g_JobInfo.szName, MAX_PATH) == 0) {
1612 UTIL_get_lang_msg("MSG_ERROR_NOREGNAME", uimsg, sizeof(uimsg),
1613 "error: no registry name", UILanguageFile);
1614 ::MessageBox(hWnd, uimsg, "TeraTerm Menu", MB_ICONSTOP | MB_OK);
1615 return FALSE;
1616 }
1617 if (_tcschr(g_JobInfo.szName, '\\') != NULL) {
1618 UTIL_get_lang_msg("MSG_ERROR_INVALIDREGNAME", uimsg, sizeof(uimsg),
1619 "can't use \"\\\" in registry name", UILanguageFile);
1620 ::MessageBox(hWnd, uimsg, "TeraTerm Menu", MB_ICONSTOP | MB_OK);
1621 return FALSE;
1622 }
1623
1624 if (::IsDlgButtonChecked(hWnd, RADIO_LOGIN) == 1)
1625 g_JobInfo.dwMode = MODE_AUTOLOGIN;
1626 if (::IsDlgButtonChecked(hWnd, RADIO_MACRO) == 1)
1627 g_JobInfo.dwMode = MODE_MACRO;
1628 if (::IsDlgButtonChecked(hWnd, RADIO_DIRECT) == 1)
1629 g_JobInfo.dwMode = MODE_DIRECT;
1630
1631 if (::GetDlgItemText(hWnd, EDIT_HOST, g_JobInfo.szHostName, MAX_PATH) == 0 && g_JobInfo.dwMode == MODE_AUTOLOGIN) {
1632 UTIL_get_lang_msg("MSG_ERROR_NOHOST", uimsg, sizeof(uimsg),
1633 "error: no host name", UILanguageFile);
1634 ::MessageBox(hWnd, uimsg, "TeraTerm Menu", MB_ICONSTOP | MB_OK);
1635 return FALSE;
1636 }
1637
1638 g_JobInfo.bUsername = (BOOL) ::IsDlgButtonChecked(hWnd, CHECK_USER);
1639 ::GetDlgItemText(hWnd, EDIT_USER, g_JobInfo.szUsername, MAX_PATH);
1640
1641 g_JobInfo.bPassword = (BOOL) ::IsDlgButtonChecked(hWnd, CHECK_PASSWORD);
1642 ::GetDlgItemText(hWnd, EDIT_PASSWORD, g_JobInfo.szPassword, MAX_PATH);
1643
1644 if (::GetDlgItemText(hWnd, EDIT_MACRO, g_JobInfo.szMacroFile, MAX_PATH) == 0 && g_JobInfo.dwMode == MODE_MACRO) {
1645 UTIL_get_lang_msg("MSG_ERROR_NOMACRO", uimsg, sizeof(uimsg),
1646 "error: no macro filename", UILanguageFile);
1647 ::MessageBox(hWnd, uimsg, "TeraTerm Menu", MB_ICONSTOP | MB_OK);
1648 return FALSE;
1649 }
1650
1651 g_JobInfo.bStartup = (BOOL) ::IsDlgButtonChecked(hWnd, CHECK_STARTUP);
1652
1653 g_JobInfo.bTtssh = (BOOL) ::IsDlgButtonChecked(hWnd, CHECK_TTSSH);
1654 if (g_JobInfo.bTtssh == TRUE && lstrstri(g_JobInfo.szTeraTerm, TERATERM) == NULL) {
1655 ::GetProfileString("Tera Term Pro", "Path", szDefault, szTTermPath, MAX_PATH);
1656 ::wsprintf(g_JobInfo.szTeraTerm, "%s\\%s", szTTermPath, TERATERM);
1657 } else if (::lstrlen(g_JobInfo.szTeraTerm) == 0) {
1658 ::GetProfileString("Tera Term Pro", "Path", szDefault, szTTermPath, MAX_PATH);
1659 ::wsprintf(g_JobInfo.szTeraTerm, "%s\\%s", szTTermPath, TERATERM);
1660 }
1661
1662 GetCurrentDirectory(sizeof(cur), cur);
1663 GetModuleFileName(NULL, modulePath, sizeof(modulePath));
1664 ExtractDirName(modulePath, modulePath);
1665 SetCurrentDirectory(modulePath);
1666 if (::GetFileAttributes(g_JobInfo.szTeraTerm) == INVALID_FILE_ATTRIBUTES) {
1667 dwErr = ::GetLastError();
1668 if (dwErr == ERROR_FILE_NOT_FOUND || dwErr == ERROR_PATH_NOT_FOUND) {
1669 UTIL_get_lang_msg("MSG_ERROR_CHECKFILE", uimsg, sizeof(uimsg),
1670 "checking [%s] file was failure.\n", UILanguageFile);
1671 ErrorMessage(hWnd, dwErr, uimsg, g_JobInfo.szTeraTerm);
1672 SetCurrentDirectory(cur);
1673 return FALSE;
1674 }
1675 }
1676
1677 if (::GetDlgItemText(hWnd, IDC_KEYFILE_PATH, g_JobInfo.PrivateKeyFile, MAX_PATH) == 0) {
1678 ZeroMemory(g_JobInfo.PrivateKeyFile, sizeof(g_JobInfo.PrivateKeyFile));
1679 }
1680 if (g_JobInfo.bTtssh) {
1681 g_JobInfo.bChallenge = (BOOL) ::IsDlgButtonChecked(hWnd, IDC_CHALLENGE_CHECK);
1682 g_JobInfo.bPageant = (BOOL) ::IsDlgButtonChecked(hWnd, IDC_PAGEANT_CHECK);
1683 }
1684
1685 if (RegSaveLoginHostInformation(&g_JobInfo) == FALSE) {
1686 dwErr = ::GetLastError();
1687 UTIL_get_lang_msg("MSG_ERROR_SAVEREG", uimsg, sizeof(uimsg),
1688 "error: couldn't save to registry.\n", UILanguageFile);
1689 ErrorMessage(hWnd, dwErr, uimsg);
1690 SetCurrentDirectory(cur);
1691 return FALSE;
1692 }
1693
1694 InitListMenu(hWnd);
1695 InitListBox(hWnd);
1696
1697 index = 0;
1698 while ((index = ::SendDlgItemMessage(hWnd, LIST_HOST, LB_SELECTSTRING, index, (LPARAM)(LPCTSTR) g_JobInfo.szName)) != LB_ERR) {
1699 ::SendDlgItemMessage(hWnd, LIST_HOST, LB_GETTEXT, index, (LPARAM)(LPCTSTR) szName);
1700 if (::lstrcmpi(g_JobInfo.szName, szName) == 0)
1701 break;
1702 }
1703
1704 SetCurrentDirectory(cur);
1705
1706 return TRUE;
1707 }
1708
1709 /* ==========================================================================
1710 Function Name : (BOOL) LoadLoginHostInformation()
1711 Outline : �������������������B
1712 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
1713 Return Value : ���� TRUE / ���s FALSE
1714 Reference :
1715 Renewal :
1716 Notes :
1717 Attention :
1718 Up Date :
1719 ======1=========2=========3=========4=========5=========6=========7======= */
1720 BOOL LoadLoginHostInformation(HWND hWnd)
1721 {
1722 long index;
1723 // char *pt;
1724 char szName[MAX_PATH];
1725 char uimsg[MAX_UIMSG];
1726 DWORD dwErr;
1727
1728 index = ::SendDlgItemMessage(hWnd, LIST_HOST, LB_GETCURSEL, 0, 0);
1729 ::SendDlgItemMessage(hWnd, LIST_HOST, LB_GETTEXT, (WPARAM) index, (LPARAM) (LPCTSTR) szName);
1730
1731 if (RegLoadLoginHostInformation(szName, &g_JobInfo) == FALSE) {
1732 dwErr = ::GetLastError();
1733 UTIL_get_lang_msg("MSG_ERROR_OPENREG", uimsg, sizeof(uimsg),
1734 "Couldn't open the registry.\n", UILanguageFile);
1735 ErrorMessage(hWnd, dwErr, uimsg);
1736 return FALSE;
1737 }
1738
1739 switch (g_JobInfo.dwMode) {
1740 case MODE_AUTOLOGIN:
1741 ::CheckRadioButton(hWnd, RADIO_LOGIN, RADIO_DIRECT, RADIO_LOGIN);
1742 EnableItem(hWnd, EDIT_HOST, TRUE);
1743 EnableItem(hWnd, CHECK_USER, TRUE);
1744 EnableItem(hWnd, EDIT_USER, g_JobInfo.bUsername);
1745 EnableItem(hWnd, CHECK_PASSWORD, TRUE);
1746 EnableItem(hWnd, EDIT_PASSWORD, g_JobInfo.bPassword);
1747 EnableItem(hWnd, EDIT_MACRO, FALSE);
1748 EnableItem(hWnd, BUTTON_MACRO, FALSE);
1749 break;
1750 case MODE_MACRO:
1751 ::CheckRadioButton(hWnd, RADIO_LOGIN, RADIO_DIRECT, RADIO_MACRO);
1752 EnableItem(hWnd, EDIT_HOST, FALSE);
1753 EnableItem(hWnd, CHECK_USER, FALSE);
1754 EnableItem(hWnd, EDIT_USER, FALSE);
1755 EnableItem(hWnd, CHECK_PASSWORD, FALSE);
1756 EnableItem(hWnd, EDIT_PASSWORD, FALSE);
1757 EnableItem(hWnd, EDIT_MACRO, TRUE);
1758 EnableItem(hWnd, BUTTON_MACRO, TRUE);
1759 break;
1760 case MODE_DIRECT:
1761 ::CheckRadioButton(hWnd, RADIO_LOGIN, RADIO_DIRECT, RADIO_DIRECT);
1762 EnableItem(hWnd, EDIT_HOST, FALSE);
1763 EnableItem(hWnd, CHECK_USER, FALSE);
1764 EnableItem(hWnd, EDIT_USER, FALSE);
1765 EnableItem(hWnd, CHECK_PASSWORD, FALSE);
1766 EnableItem(hWnd, EDIT_PASSWORD, FALSE);
1767 EnableItem(hWnd, EDIT_MACRO, FALSE);
1768 EnableItem(hWnd, BUTTON_MACRO, FALSE);
1769 break;
1770 }
1771
1772 if (::lstrlen(g_JobInfo.szName) == 0)
1773 ::lstrcpy(g_JobInfo.szName, g_JobInfo.szHostName);
1774
1775 ::SetDlgItemText(hWnd, EDIT_ENTRY, g_JobInfo.szName);
1776 ::SetDlgItemText(hWnd, EDIT_HOST, g_JobInfo.szHostName);
1777 ::SetDlgItemText(hWnd, EDIT_USER, g_JobInfo.szUsername);
1778 ::SetDlgItemText(hWnd, EDIT_PASSWORD, g_JobInfo.szPassword);
1779
1780 ::SetDlgItemText(hWnd, EDIT_MACRO, g_JobInfo.szMacroFile);
1781
1782 ::CheckDlgButton(hWnd, CHECK_USER, g_JobInfo.bUsername);
1783
1784 ::CheckDlgButton(hWnd, CHECK_PASSWORD, g_JobInfo.bPassword);
1785
1786 ::CheckDlgButton(hWnd, CHECK_TTSSH, g_JobInfo.bTtssh);
1787
1788 // �������t�@�C�������� (2005.1.28 yutaka)
1789 ::SetDlgItemText(hWnd, IDC_KEYFILE_PATH, g_JobInfo.PrivateKeyFile);
1790 if (g_JobInfo.bTtssh == TRUE) {
1791 EnableWindow(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), TRUE);
1792 EnableWindow(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), TRUE);
1793 if (g_JobInfo.bChallenge) {
1794 SendMessage(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), BM_SETCHECK, BST_CHECKED, 0);
1795 SendMessage(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), BM_SETCHECK, BST_UNCHECKED, 0);
1796 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), FALSE);
1797 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), FALSE);
1798 EnableWindow(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), FALSE);
1799 } else if (g_JobInfo.bPageant) {
1800 SendMessage(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), BM_SETCHECK, BST_CHECKED, 0);
1801 SendMessage(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), BM_SETCHECK, BST_UNCHECKED, 0);
1802 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), FALSE);
1803 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), FALSE);
1804 EnableWindow(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), FALSE);
1805 } else {
1806 SendMessage(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), BM_SETCHECK, BST_UNCHECKED, 0);
1807 SendMessage(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), BM_SETCHECK, BST_UNCHECKED, 0);
1808 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), TRUE);
1809 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), TRUE);
1810 }
1811
1812 } else {
1813 SendMessage(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), BM_SETCHECK, BST_UNCHECKED, 0);
1814 SendMessage(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), BM_SETCHECK, BST_UNCHECKED, 0);
1815 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), FALSE);
1816 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), FALSE);
1817 EnableWindow(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), FALSE);
1818 EnableWindow(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), FALSE);
1819
1820 }
1821
1822 ::CheckDlgButton(hWnd, CHECK_STARTUP, g_JobInfo.bStartup);
1823
1824 return TRUE;
1825 }
1826
1827 /* ==========================================================================
1828 Function Name : (BOOL) DeleteLoginHostInformation()
1829 Outline : �������������������B
1830 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
1831 Return Value : ���� TRUE / ���s FALSE
1832 Reference :
1833 Renewal :
1834 Notes :
1835 Attention :
1836 Up Date :
1837 ======1=========2=========3=========4=========5=========6=========7======= */
1838 BOOL DeleteLoginHostInformation(HWND hWnd)
1839 {
1840 long index;
1841 char szEntryName[MAX_PATH];
1842 char szSubKey[MAX_PATH];
1843 char uimsg[MAX_UIMSG];
1844 DWORD dwErr;
1845
1846 if ((index = ::SendDlgItemMessage(hWnd, LIST_HOST, LB_GETCURSEL, 0, 0)) == LB_ERR) {
1847 UTIL_get_lang_msg("MSG_ERROR_SELECTREG", uimsg, sizeof(uimsg),
1848 "Select deleted registry name", UILanguageFile);
1849 ::MessageBox(hWnd, uimsg, "TeraTerm Menu", MB_ICONSTOP | MB_OK);
1850 return FALSE;
1851 }
1852
1853 if (::SendDlgItemMessage(hWnd, LIST_HOST, LB_GETTEXT, (WPARAM) index, (LPARAM) (LPCTSTR) szEntryName) == LB_ERR) {
1854 UTIL_get_lang_msg("MSG_ERROR_GETDELETEREG", uimsg, sizeof(uimsg),
1855 "Couldn't get the deleting entry", UILanguageFile);
1856 ::MessageBox(hWnd, uimsg, "TeraTerm Menu", MB_ICONSTOP | MB_OK);
1857 return FALSE;
1858 }
1859
1860 ::wsprintf(szSubKey, "%s\\%s", TTERM_KEY, szEntryName);
1861 if (RegDelete(HKEY_CURRENT_USER, szSubKey) != ERROR_SUCCESS) {
1862 dwErr = ::GetLastError();
1863 UTIL_get_lang_msg("MSG_ERROR_DELETEREG", uimsg, sizeof(uimsg),
1864 "Couldn't delete the registry.\n", UILanguageFile);
1865 ErrorMessage(hWnd, dwErr, uimsg);
1866 return FALSE;
1867 }
1868
1869 InitListMenu(hWnd);
1870 InitListBox(hWnd);
1871
1872 return TRUE;
1873 }
1874
1875 /* ==========================================================================
1876 Function Name : (BOOL) ManageWMCommand_Config()
1877 Outline : ���������_�C�A���O��WM_COMMAND�����������B
1878 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
1879 : WPARAM wParam (In)
1880 Return Value : ���� TRUE / ������ FALSE
1881 Reference :
1882 Renewal :
1883 Notes :
1884 Attention :
1885 Up Date :
1886 ======1=========2=========3=========4=========5=========6=========7======= */
1887 BOOL ManageWMCommand_Config(HWND hWnd, WPARAM wParam)
1888 {
1889 char *pt;
1890 int ret = 0;
1891 char title[MAX_UIMSG], filter[MAX_UIMSG];
1892
1893 // �������t�@�C�����R���g���[�� (2005.1.28 yutaka)
1894 switch(wParam) {
1895 case CHECK_TTSSH | (BN_CLICKED << 16) :
1896 ret = SendMessage(GetDlgItem(hWnd, CHECK_TTSSH), BM_GETCHECK, 0, 0);
1897 if (ret & BST_CHECKED) {
1898 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), TRUE);
1899 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), TRUE);
1900 EnableWindow(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), TRUE);
1901 EnableWindow(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), TRUE);
1902
1903 } else {
1904 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), FALSE);
1905 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), FALSE);
1906 EnableWindow(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), FALSE);
1907 EnableWindow(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), FALSE);
1908
1909 }
1910 return TRUE;
1911
1912 case IDC_CHALLENGE_CHECK | (BN_CLICKED << 16) :
1913 // "use Challenge"���`�F�b�N�������������t�@�C����disabled�������B(2007.11.14 yutaka)
1914 ret = SendMessage(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), BM_GETCHECK, 0, 0);
1915 if (ret & BST_CHECKED) {
1916 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), FALSE);
1917 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), FALSE);
1918 EnableWindow(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), FALSE);
1919
1920 } else {
1921 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), TRUE);
1922 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), TRUE);
1923 EnableWindow(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), TRUE);
1924
1925 }
1926 return TRUE;
1927
1928 case IDC_PAGEANT_CHECK | (BN_CLICKED << 16) :
1929 // "use Pageant"���N���b�N�������B(2008.5.26 maya)
1930 ret = SendMessage(GetDlgItem(hWnd, IDC_PAGEANT_CHECK), BM_GETCHECK, 0, 0);
1931 if (ret & BST_CHECKED) {
1932 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), FALSE);
1933 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), FALSE);
1934 EnableWindow(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), FALSE);
1935
1936 } else {
1937 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_PATH), TRUE);
1938 EnableWindow(GetDlgItem(hWnd, IDC_KEYFILE_BUTTON), TRUE);
1939 EnableWindow(GetDlgItem(hWnd, IDC_CHALLENGE_CHECK), TRUE);
1940
1941 }
1942 return TRUE;
1943
1944 default:
1945 break;
1946 }
1947
1948 switch(LOWORD(wParam)) {
1949 case IDOK:
1950 case IDCANCEL:
1951 g_hWndMenu = NULL;
1952 ::EndDialog(hWnd, TRUE);
1953 if (g_ConfigFont != NULL) {
1954 DeleteObject(g_ConfigFont);
1955 }
1956 return TRUE;
1957 case BUTTON_SET:
1958 SaveLoginHostInformation(hWnd);
1959 return TRUE;
1960 case BUTTON_DELETE:
1961 DeleteLoginHostInformation(hWnd);
1962 return TRUE;
1963 case BUTTON_ETC:
1964 ::GetDlgItemText(hWnd, EDIT_ENTRY, g_JobInfo.szName, MAX_PATH);
1965 g_JobInfo.bTtssh = ::IsDlgButtonChecked(hWnd, CHECK_TTSSH);
1966 if (TTDialogBox(g_hI, (LPCTSTR) DIALOG_ETC, hWnd, DlgCallBack_Etc) == TRUE) {
1967 ::CheckDlgButton(hWnd, CHECK_TTSSH, 0);
1968 if ((pt = lstrstri(g_JobInfo.szTeraTerm, TERATERM)) != NULL)
1969 if (::lstrcmpi(pt, TERATERM) == 0)
1970 ::CheckDlgButton(hWnd, CHECK_TTSSH, 1);
1971 }
1972 return TRUE;
1973 case LIST_HOST:
1974 if (HIWORD(wParam) == LBN_SELCHANGE)
1975 LoadLoginHostInformation(hWnd);
1976 return TRUE;
1977 case CHECK_USER:
1978 if (IsDlgButtonChecked(hWnd, CHECK_USER) == 1)
1979 EnableItem(hWnd, EDIT_USER, TRUE);
1980 else {
1981 EnableItem(hWnd, EDIT_USER, FALSE);
1982 ::CheckDlgButton(hWnd, CHECK_PASSWORD, 0);
1983 ::PostMessage(hWnd, WM_COMMAND, (WPARAM) CHECK_PASSWORD, (LPARAM) 0);
1984 }
1985 return TRUE;
1986 case CHECK_PASSWORD:
1987 if (IsDlgButtonChecked(hWnd, CHECK_PASSWORD) == 1)
1988 EnableItem(hWnd, EDIT_PASSWORD, TRUE);
1989 else
1990 EnableItem(hWnd, EDIT_PASSWORD, FALSE);
1991 return TRUE;
1992 case CHECK_INI_FILE:
1993 if (IsDlgButtonChecked(hWnd, CHECK_INI_FILE) == 1)
1994 EnableItem(hWnd, COMBO_INI_FILE, TRUE);
1995 else
1996 EnableItem(hWnd, COMBO_INI_FILE, FALSE);
1997 return TRUE;
1998 case BUTTON_MACRO:
1999 ::GetDlgItemText(hWnd, EDIT_MACRO, g_JobInfo.szMacroFile, MAX_PATH);
2000 UTIL_get_lang_msg("FILEDLG_MACRO_TITLE", title, sizeof(title),
2001 "specifying macro file", UILanguageFile);
2002 UTIL_get_lang_msg("FILEDLG_MACRO_FILTER", filter, sizeof(filter),
2003 "macro file(*.ttl)\\0*.ttl\\0all files(*.*)\\0*.*\\0\\0", UILanguageFile);
2004 OpenFileDlg(hWnd, EDIT_MACRO, title, filter, g_JobInfo.szMacroFile);
2005 return TRUE;
2006
2007 case IDC_KEYFILE_BUTTON:
2008 ::GetDlgItemText(hWnd, IDC_KEYFILE_PATH, g_JobInfo.PrivateKeyFile, MAX_PATH);
2009 UTIL_get_lang_msg("FILEDLG_KEY_TITLE", title, sizeof(title),
2010 "specifying private key file", UILanguageFile);
2011 UTIL_get_lang_msg("FILEDLG_KEY_FILTER", filter, sizeof(filter),
2012 "identity files\\0identity;id_rsa;id_dsa\\0identity(RSA1)\\0identity\\0id_rsa(SSH2)\\0id_rsa\\0id_dsa(SSH2)\\0id_dsa\\0all(*.*)\\0*.*\\0\\0", UILanguageFile);
2013 OpenFileDlg(hWnd, IDC_KEYFILE_PATH, title, filter, g_JobInfo.PrivateKeyFile);
2014 return TRUE;
2015
2016 case RADIO_LOGIN:
2017 EnableItem(hWnd, EDIT_HOST, TRUE);
2018 EnableItem(hWnd, CHECK_USER, TRUE);
2019 if (IsDlgButtonChecked(hWnd, CHECK_USER) == 1)
2020 EnableItem(hWnd, EDIT_USER, TRUE);
2021 else {
2022 EnableItem(hWnd, EDIT_USER, FALSE);
2023 }
2024 EnableItem(hWnd, CHECK_PASSWORD, TRUE);
2025 if (IsDlgButtonChecked(hWnd, CHECK_PASSWORD) == 1)
2026 EnableItem(hWnd, EDIT_PASSWORD, TRUE);
2027 else
2028 EnableItem(hWnd, EDIT_PASSWORD, FALSE);
2029 EnableItem(hWnd, EDIT_MACRO, FALSE);
2030 EnableItem(hWnd, BUTTON_MACRO, FALSE);
2031 return TRUE;
2032 case RADIO_MACRO:
2033 EnableItem(hWnd, EDIT_HOST, FALSE);
2034 EnableItem(hWnd, CHECK_USER, FALSE);
2035 EnableItem(hWnd, EDIT_USER, FALSE);
2036 EnableItem(hWnd, CHECK_PASSWORD, FALSE);
2037 EnableItem(hWnd, EDIT_PASSWORD, FALSE);
2038 EnableItem(hWnd, EDIT_MACRO, TRUE);
2039 EnableItem(hWnd, BUTTON_MACRO, TRUE);
2040 return TRUE;
2041 case RADIO_DIRECT:
2042 EnableItem(hWnd, EDIT_HOST, FALSE);
2043 EnableItem(hWnd, CHECK_USER, FALSE);
2044 EnableItem(hWnd, EDIT_USER, FALSE);
2045 EnableItem(hWnd, CHECK_PASSWORD, FALSE);
2046 EnableItem(hWnd, EDIT_PASSWORD, FALSE);
2047 EnableItem(hWnd, EDIT_MACRO, FALSE);
2048 EnableItem(hWnd, BUTTON_MACRO, FALSE);
2049 return TRUE;
2050 }
2051
2052 return FALSE;
2053 }
2054
2055 /* ==========================================================================
2056 Function Name : (BOOL) ManageWMCommand_Etc()
2057 Outline : �������������_�C�A���O��WM_COMMAND�����������B
2058 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
2059 : WPARAM wParam (In)
2060 Return Value : ���� TRUE / ������ FALSE
2061 Reference :
2062 Renewal :
2063 Notes :
2064 Attention :
2065 Up Date :
2066 ======1=========2=========3=========4=========5=========6=========7======= */
2067 BOOL ManageWMCommand_Etc(HWND hWnd, WPARAM wParam)
2068 {
2069 char szPath[MAX_PATH];
2070 char title[MAX_UIMSG], filter[MAX_UIMSG];
2071
2072 switch(LOWORD(wParam)) {
2073 case IDOK:
2074 SaveEtcInformation(hWnd);
2075 ::EndDialog(hWnd, TRUE);
2076 if (g_DetailFont != NULL) {
2077 DeleteObject(g_DetailFont);
2078 }
2079 return TRUE;
2080 case IDCANCEL:
2081 ::EndDialog(hWnd, FALSE);
2082 if (g_DetailFont != NULL) {
2083 DeleteObject(g_DetailFont);
2084 }
2085 return TRUE;
2086 case BUTTON_DEFAULT:
2087 SetDefaultEtcDlg(hWnd);
2088 return TRUE;
2089 case BUTTON_TTMPATH:
2090 ::GetDlgItemText(hWnd, EDIT_TTMPATH, szPath, MAX_PATH);
2091 UTIL_get_lang_msg("FILEDLG_TERATERM_TITLE", title, sizeof(title),
2092 "specifying TeraTerm", UILanguageFile);
2093 UTIL_get_lang_msg("FILEDLG_TERATERM_FILTER", filter, sizeof(filter),
2094 "execute file(*.exe)\\0*.exe\\0all files(*.*)\\0*.*\\0\\0", UILanguageFile);
2095 OpenFileDlg(hWnd, EDIT_TTMPATH, title, filter, szPath);
2096 return TRUE;
2097 case BUTTON_INITFILE:
2098 ::GetDlgItemText(hWnd, EDIT_INITFILE, szPath, MAX_PATH);
2099 UTIL_get_lang_msg("FILEDLG_INI_TITLE", title, sizeof(title),
2100 "specifying config file", UILanguageFile);
2101 UTIL_get_lang_msg("FILEDLG_INI_FILTER", filter, sizeof(filter),
2102 "config file(*.ini)\\0*.ini\\0all files(*.*)\\0*.*\\0\\0", UILanguageFile);
2103 OpenFileDlg(hWnd, EDIT_INITFILE, title, filter, szPath);
2104 return TRUE;
2105 case BUTTON_LOG:
2106 ::GetDlgItemText(hWnd, EDIT_LOG, szPath, MAX_PATH);
2107 UTIL_get_lang_msg("FILEDLG_LOG_TITLE", title, sizeof(title),
2108 "specifying log file", UILanguageFile);
2109 UTIL_get_lang_msg("FILEDLG_LOG_FILTER", filter, sizeof(filter),
2110 "log file(*.log)\\0*.log\\0all files(*.*)\\0*.*\\0\\0", UILanguageFile);
2111 OpenFileDlg(hWnd, EDIT_LOG, title, filter, szPath);
2112 return TRUE;
2113 }
2114
2115 return FALSE;
2116 }
2117
2118
2119 /* ==========================================================================
2120 Function Name : (BOOL) ManageWMCommand_Version()
2121 Outline : �u�o�[�W���������v�_�C�A���O��WM_COMMAND�����������B
2122 Arguments : HWND hWnd (In) �_�C�A���O���n���h��
2123 : WPARAM wParam (In)
2124 Return Value : ���� TRUE / ������ FALSE
2125 Reference :
2126 Renewal :
2127 Notes :
2128 Attention :
2129 Up Date :
2130 ======1=========2=========3=========4=========5=========6=========7======= */
2131 BOOL ManageWMCommand_Version(HWND hWnd, WPARAM wParam)
2132 {
2133 switch(LOWORD(wParam)) {
2134 case IDOK:
2135 ::EndDialog(hWnd, TRUE);
2136 if (g_AboutFont != NULL) {
2137 DeleteObject(g_AboutFont);
2138 }
2139 return TRUE;
2140 case IDCANCEL:
2141 ::EndDialog(hWnd, TRUE);
2142 if (g_AboutFont != NULL) {
2143 DeleteObject(g_AboutFont);
2144 }
2145 return TRUE;
2146 }
2147
2148 return FALSE;
2149 }
2150
2151 /* ==========================================================================
2152 Function Name : (BOOL) ManageWMCommand_Menu()
2153 Outline : ���C���E�C���h�E��WM_COMMAND�����������B
2154 Arguments : HWND hWnd (In) �E�C���h�E���n���h��
2155 : WPARAM wParam (In)
2156 Return Value : ���� TRUE / ������ FALSE
2157 Reference :
2158 Renewal :
2159 Notes :
2160 Attention :
2161 Up Date :
2162 ======1=========2=========3=========4=========5=========6=========7======= */
2163 BOOL ManageWMCommand_Menu(HWND hWnd, WPARAM wParam)
2164 {
2165 char uimsg[MAX_UIMSG];
2166
2167 switch(LOWORD(wParam)) {
2168 case ID_TMENU_ADD:
2169 TTDialogBox(g_hI, (LPCTSTR) DIALOG_CONFIG, 0, DlgCallBack_Config);
2170 return TRUE;
2171 case ID_TMENU_CLOSE:
2172 ::DestroyWindow(hWnd);
2173 return TRUE;
2174 case ID_VERSION:
2175 TTDialogBox(g_hI, (LPCTSTR) DIALOG_VERSION, hWnd, DlgCallBack_Version);
2176 return TRUE;
2177 case ID_ICON:
2178 if (GetMenuState(g_hConfigMenu, ID_ICON, MF_BYCOMMAND & MF_CHECKED) != 0) {
2179 UTIL_get_lang_msg("MENU_ICON", uimsg, sizeof(uimsg), STR_ICONMODE, UILanguageFile);
2180 ::ModifyMenu(g_hConfigMenu, ID_ICON, MF_BYCOMMAND, ID_ICON, uimsg);
2181 g_MenuData.dwIconMode = MODE_SMALLICON;
2182 } else {
2183 UTIL_get_lang_msg("MENU_ICON", uimsg, sizeof(uimsg), STR_ICONMODE, UILanguageFile);
2184 ::ModifyMenu(g_hConfigMenu, ID_ICON, MF_CHECKED | MF_BYCOMMAND, ID_ICON, uimsg);
2185 g_MenuData.dwIconMode = MODE_LARGEICON;
2186 }
2187 RedrawMenu(hWnd);
2188 return TRUE;
2189 case ID_LEFTPOPUP:
2190 if (GetMenuState(g_hConfigMenu, ID_LEFTPOPUP, MF_BYCOMMAND & MF_CHECKED) != 0) {
2191 UTIL_get_lang_msg("MENU_LEFTPOPUP", uimsg, sizeof(uimsg), STR_LEFTBUTTONPOPUP, UILanguageFile);
2192 ::ModifyMenu(g_hConfigMenu, ID_LEFTPOPUP, MF_BYCOMMAND, ID_LEFTPOPUP, uimsg);
2193 g_MenuData.bLeftButtonPopup = FALSE;
2194 } else {
2195 UTIL_get_lang_msg("MENU_LEFTPOPUP", uimsg, sizeof(uimsg), STR_LEFTBUTTONPOPUP, UILanguageFile);
2196 ::ModifyMenu(g_hConfigMenu, ID_LEFTPOPUP, MF_CHECKED | MF_BYCOMMAND, ID_LEFTPOPUP, uimsg);
2197 g_MenuData.bLeftButtonPopup = TRUE;
2198 }
2199 return TRUE;
2200 case ID_HOTKEY:
2201 if (GetMenuState(g_hConfigMenu, ID_HOTKEY, MF_BYCOMMAND & MF_CHECKED) != 0) {
2202 UTIL_get_lang_msg("MENU_HOTKEY", uimsg, sizeof(uimsg), STR_HOTKEY, UILanguageFile);
2203 ::ModifyMenu(g_hConfigMenu, ID_HOTKEY, MF_BYCOMMAND, ID_HOTKEY, uimsg);
2204 ::UnregisterHotKey(g_hWnd, WM_MENUOPEN);
2205 g_MenuData.bHotkey = FALSE;
2206 } else {
2207 UTIL_get_lang_msg("MENU_HOTKEY", uimsg, sizeof(uimsg), STR_HOTKEY, UILanguageFile);
2208 ::ModifyMenu(g_hConfigMenu, ID_HOTKEY, MF_CHECKED | MF_BYCOMMAND, ID_HOTKEY, uimsg);
2209 ::RegisterHotKey(g_hWnd, WM_MENUOPEN, MOD_CONTROL | MOD_ALT, 'M');
2210 g_MenuData.bHotkey = TRUE;
2211 }
2212 return TRUE;
2213 case ID_FONT:
2214 SetMenuFont(hWnd);
2215 break;
2216 case ID_NOENTRY:
2217 return TRUE;
2218 default:
2219 ConnectHost(hWnd, LOWORD(wParam));
2220 return TRUE;
2221 }
2222
2223 return FALSE;
2224 }
2225
2226 /* ==========================================================================
2227 Function Name : (BOOL CALLBACK) DlgCallBack_Config()
2228 Outline : �����_�C�A���O���R�[���o�b�N����
2229 : �iDialogProc���w���v�Q���j
2230 Arguments :
2231 :
2232 Return Value :
2233 Reference :
2234 Renewal :
2235 Notes :
2236 Attention :
2237 Up Date :
2238 ======1=========2=========3=========4=========5=========6=========7======= */
2239 INT_PTR CALLBACK DlgCallBack_Config(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2240 {
2241 TEXTMETRIC textMetric;
2242 PDRAWITEMSTRUCT lpdis;
2243 LPMEASUREITEMSTRUCT lpmis;
2244 static COLORREF crSelText;
2245 static COLORREF crSelBkgnd;
2246 static COLORREF crText;
2247 static COLORREF crBkgnd;
2248
2249 switch(uMsg) {
2250 case WM_INITDIALOG:
2251 if (g_hWndMenu == NULL)
2252 g_hWndMenu = hWnd;
2253 else {
2254 ::SetForceForegroundWindow(g_hWndMenu);
2255 ::EndDialog(hWnd, FALSE);
2256 }
2257 SetDlgPos(hWnd, POSITION_CENTER);
2258 PostMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)g_hIcon);
2259 PostMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)g_hIconSmall);
2260 CreateTooltip();
2261 crText = ::GetSysColor(COLOR_WINDOWTEXT);
2262 crBkgnd = ::GetSysColor(COLOR_WINDOW);
2263 crSelText = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
2264 crSelBkgnd = ::GetSysColor(COLOR_HIGHLIGHT);
2265 InitConfigDlg(hWnd);
2266 return TRUE;
2267 case WM_COMMAND:
2268 return ManageWMCommand_Config(hWnd, wParam);
2269 case WM_NOTIFY:
2270 return ManageWMNotify_Config(lParam);
2271 case WM_DESTROY:
2272 ::UnhookWindowsHookEx(g_hHook);
2273 return TRUE;
2274 case WM_MEASUREITEM:
2275 lpmis = (LPMEASUREITEMSTRUCT) lParam;
2276 lpmis->itemHeight = LISTBOX_HEIGHT;
2277 return TRUE;
2278 case WM_DRAWITEM:
2279 lpdis = (LPDRAWITEMSTRUCT) lParam;
2280 if (lpdis->itemID == -1)
2281 return TRUE;
2282 if (lpdis->itemState & ODS_SELECTED) {
2283 ::SetTextColor(lpdis->hDC, crSelText);
2284 ::SetBkColor(lpdis->hDC, crSelBkgnd);
2285 } else {
2286 ::SetTextColor(lpdis->hDC, crText);
2287 ::SetBkColor(lpdis->hDC, crBkgnd);
2288 }
2289 ::GetTextMetrics(lpdis->hDC, &textMetric);
2290 ::ExtTextOut(lpdis->hDC,
2291 lpdis->rcItem.left + LISTBOX_WIDTH,
2292 lpdis->rcItem.top + (ICONSIZE_SMALL - textMetric.tmHeight) / 2,
2293 ETO_OPAQUE,
2294 &lpdis->rcItem,
2295 g_MenuData.szName[lpdis->itemData],
2296 ::lstrlen(g_MenuData.szName[lpdis->itemData]),
2297 NULL);
2298 ::DrawIconEx(lpdis->hDC,
2299 lpdis->rcItem.left + (LISTBOX_WIDTH - ICONSIZE_SMALL) / 2,
2300 lpdis->rcItem.top + (LISTBOX_HEIGHT - ICONSIZE_SMALL) / 2,
2301 g_MenuData.hSmallIcon[lpdis->itemData],
2302 ICONSIZE_SMALL,
2303 ICONSIZE_SMALL,
2304 NULL,
2305 NULL,
2306 DI_NORMAL);
2307 return TRUE;
2308 }
2309
2310 return FALSE;
2311 }
2312
2313 /* ==========================================================================
2314 Function Name : (BOOL CALLBACK) DlgCallBack_Etc()
2315 Outline : ���������_�C�A���O���R�[���o�b�N����
2316 : �iDialogProc���w���v�Q���j
2317 Arguments :
2318 :
2319 Return Value :
2320 Reference :
2321 Renewal :
2322 Notes :
2323 Attention :
2324 Up Date :
2325 ======1=========2=========3=========4=========5=========6=========7======= */
2326 INT_PTR CALLBACK DlgCallBack_Etc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2327 {
2328 switch(uMsg) {
2329 case WM_INITDIALOG:
2330 SetDlgPos(hWnd, POSITION_CENTER);
2331 InitEtcDlg(hWnd);
2332 return TRUE;
2333 case WM_COMMAND:
2334 return ManageWMCommand_Etc(hWnd, wParam);
2335 }
2336
2337 return FALSE;
2338 }
2339
2340 /* ==========================================================================
2341 Function Name : (BOOL CALLBACK) DlgCallBack_Version()
2342 Outline : �u�o�[�W���������v�_�C�A���O���R�[���o�b�N����
2343 : �iDialogProc���w���v�Q���j
2344 Arguments :
2345 :
2346 Return Value :
2347 Reference :
2348 Renewal :
2349 Notes :
2350 Attention :
2351 Up Date :
2352 ======1=========2=========3=========4=========5=========6=========7======= */
2353 INT_PTR CALLBACK DlgCallBack_Version(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2354 {
2355 switch(uMsg) {
2356 case WM_INITDIALOG:
2357 SetDlgPos(hWnd, POSITION_CENTER);
2358 PostMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)g_hIcon);
2359 PostMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)g_hIconSmall);
2360 SendDlgItemMessage(hWnd, IDC_TTPMENU_ICON, STM_SETICON, (WPARAM)g_hIcon, 0);
2361 InitVersionDlg(hWnd);
2362 return TRUE;
2363 case WM_COMMAND:
2364 return ManageWMCommand_Version(hWnd, wParam);
2365 }
2366
2367 return FALSE;
2368 }
2369
2370 /* ==========================================================================
2371 Function Name : (LRESULT CALLBACK) WinProc()
2372 Outline : ���C���E�C���h�E���R�[���o�b�N����
2373 : �iWindowProc���w���v�Q���j
2374 Arguments :
2375 :
2376 Return Value :
2377 Reference :
2378 Renewal :
2379 Notes :
2380 Attention :
2381 Up Date :
2382 ======1=========2=========3=========4=========5=========6=========7======= */
2383 LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2384 {
2385 HDC hDC;
2386 HWND hWndItem;
2387 BOOL bRet;
2388 SIZE size;
2389 DWORD dwIconSize;
2390 DWORD dwIconSpace;
2391 TEXTMETRIC textMetric;
2392 LPDRAWITEMSTRUCT lpdis;
2393 LPMEASUREITEMSTRUCT lpmis;
2394 static UINT WM_TASKBAR_RESTART;
2395
2396 g_hWnd = hWnd;
2397
2398 switch(uMsg) {
2399 case WM_CREATE:
2400 PostMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)g_hIcon);
2401 PostMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)g_hIconSmall);
2402 SetDlgPos(hWnd, POSITION_CENTER);
2403 ::ShowWindow(hWnd, SW_HIDE);
2404 SetTaskTray(hWnd, NIM_ADD);
2405 WM_TASKBAR_RESTART = ::RegisterWindowMessage("TaskbarCreated");
2406 InitMenu();
2407 LoadConfig();
2408 InitListMenu(hWnd);
2409 ExecStartup(hWnd);
2410 return TRUE;
2411 case WM_COMMAND:
2412 bRet = ManageWMCommand_Menu(hWnd, wParam);
2413 return bRet;
2414 case WM_TMENU_NOTIFY:
2415 ::PostMessage(hWnd, (UINT) lParam, 0, 0);
2416 return TRUE;
2417 case WM_DISPLAYCHANGE:
2418 InitListMenu(hWnd);
2419 return TRUE;
2420 case WM_ENDSESSION:
2421 case WM_DESTROY:
2422 SaveConfig();
2423 SetTaskTray(hWnd, NIM_DELETE);
2424 ::UnregisterHotKey(hWnd, WM_MENUOPEN);
2425 DeleteListMenuIcons();
2426 ::DestroyMenu(g_hListMenu);
2427 ::DestroyMenu(g_hMenu);
2428 ::PostQuitMessage(0);
2429 return TRUE;
2430 case WM_HOTKEY:
2431 if (g_MenuData.bHotkey == TRUE)
2432 PopupListMenu(hWnd);
2433 return TRUE;
2434 case WM_LBUTTONDOWN:
2435 case WM_NCLBUTTONDOWN:
2436 if (g_MenuData.bLeftButtonPopup == TRUE)
2437 PopupListMenu(hWnd);
2438 else
2439 PopupMenu(hWnd);
2440 return TRUE;
2441 case WM_RBUTTONDOWN:
2442 case WM_NCRBUTTONDOWN:
2443 PopupMenu(hWnd);
2444 return TRUE;
2445 case WM_MEASUREITEM:
2446 lpmis = (LPMEASUREITEMSTRUCT) lParam;
2447 hWndItem = ::GetDlgItem((HWND) g_hListMenu, (UINT) wParam);
2448 hDC = ::GetWindowDC(hWndItem);
2449 if (g_MenuData.hFont != NULL)
2450 ::SelectObject(hDC, (HGDIOBJ) g_MenuData.hFont);
2451 ::GetTextExtentPoint32(hDC, g_MenuData.szName[lpmis->itemData], ::lstrlen(g_MenuData.szName[lpmis->itemData]), &size);
2452 if (g_MenuData.dwIconMode == MODE_SMALLICON) {
2453 lpmis->itemWidth = ICONSPACE_SMALL + size.cx;
2454 lpmis->itemHeight = g_MenuData.dwMenuHeight;
2455 } else {
2456 lpmis->itemWidth = ICONSPACE_LARGE + size.cx;
2457 lpmis->itemHeight = g_MenuData.dwMenuHeight;
2458 }
2459 ::ReleaseDC(hWndItem, hDC);
2460 return TRUE;
2461 case WM_DRAWITEM:
2462 lpdis = (LPDRAWITEMSTRUCT) lParam;
2463 if (lpdis->itemID == -1)
2464 return TRUE;
2465 if (g_MenuData.hFont != NULL)
2466 ::SelectObject(lpdis->hDC, (HGDIOBJ) g_MenuData.hFont);
2467 if (lpdis->itemState & ODS_SELECTED) {
2468 ::SetTextColor(lpdis->hDC, g_MenuData.crSelMenuTxt);
2469 ::SetBkColor(lpdis->hDC, g_MenuData.crSelMenuBg);
2470 } else {
2471 ::SetTextColor(lpdis->hDC, g_MenuData.crMenuTxt);
2472 ::SetBkColor(lpdis->hDC, g_MenuData.crMenuBg);
2473 }
2474 if (g_MenuData.dwIconMode == MODE_LARGEICON) {
2475 dwIconSize = ICONSIZE_LARGE;
2476 dwIconSpace = ICONSPACE_LARGE;
2477 } else {
2478 dwIconSize = ICONSIZE_SMALL;
2479 dwIconSpace = ICONSPACE_SMALL;
2480 }
2481 ::GetTextMetrics(lpdis->hDC, &textMetric);
2482 ::ExtTextOut(lpdis->hDC,
2483 lpdis->rcItem.left + dwIconSpace,
2484 lpdis->rcItem.top + (g_MenuData.dwMenuHeight - textMetric.tmHeight) / 2,
2485 ETO_OPAQUE,
2486 &lpdis->rcItem,
2487 g_MenuData.szName[lpdis->itemData],
2488 ::lstrlen(g_MenuData.szName[lpdis->itemData]),
2489 NULL);
2490 ::DrawIconEx(lpdis->hDC,
2491 lpdis->rcItem.left + (dwIconSpace - dwIconSize) / 2,
2492 lpdis->rcItem.top + (g_MenuData.dwMenuHeight - dwIconSize) / 2,
2493 (g_MenuData.dwIconMode == MODE_LARGEICON) ? g_MenuData.hLargeIcon[lpdis->itemData] : g_MenuData.hSmallIcon[lpdis->itemData],
2494 dwIconSize,
2495 dwIconSize,
2496 NULL,
2497 NULL,
2498 DI_NORMAL);
2499 return TRUE;
2500 }
2501
2502 if (WM_TASKBAR_RESTART != 0 && uMsg == WM_TASKBAR_RESTART)
2503 SetTaskTray(hWnd, NIM_ADD);
2504
2505 return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
2506 }
2507
2508 static void GetUILanguageFile()
2509 {
2510 /* Get LanguageFile name */
2511 wchar_t *lng_rel;
2512 hGetPrivateProfileStringW(L"Tera Term", L"UILanguageFile", NULL, SetupFNameW, &lng_rel);
2513 if (lng_rel[0] == L'\0') {
2514 free(lng_rel);
2515 lng_rel = _wcsdup(L"lang\\Default.lng");
2516 }
2517
2518 wchar_t *ExeDirW = GetExeDirW(NULL);
2519 UILanguageFileW = GetUILanguageFileFullW(ExeDirW, lng_rel);
2520 free(ExeDirW);
2521 free(lng_rel);
2522
2523 WideCharToACP_t(UILanguageFileW, UILanguageFile, sizeof(UILanguageFile));
2524 }
2525
2526 /* ==========================================================================
2527 Function Name : (int WINAPI) WinMain()
2528 Outline : ���C������
2529 Arguments :
2530 :
2531 Return Value :
2532 Reference :
2533 Renewal :
2534 Notes :
2535 Attention :
2536 Up Date :
2537 ======1=========2=========3=========4=========5=========6=========7======= */
2538 int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR nCmdLine, int nCmdShow)
2539 {
2540 typedef BOOL (WINAPI *pSetDllDir)(LPCSTR);
2541 typedef BOOL (WINAPI *pSetDefDllDir)(DWORD);
2542
2543 MSG msg;
2544 HWND hWnd;
2545 WNDCLASS winClass;
2546 DWORD dwErr;
2547 int fuLoad = LR_DEFAULTCOLOR;
2548 HMODULE module;
2549 pSetDllDir setDllDir;
2550 pSetDefDllDir setDefDllDir;
2551
2552 #ifdef _DEBUG
2553 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
2554 #endif
2555
2556 if ((module = GetModuleHandle("kernel32.dll")) != NULL) {
2557 if ((setDefDllDir = (pSetDefDllDir)GetProcAddress(module, "SetDefaultDllDirectories")) != NULL) {
2558 // SetDefaultDllDirectories() ���g�����������A�����p�X�� %WINDOWS%\system32 ��������������
2559 (*setDefDllDir)((DWORD)0x00000800); // LOAD_LIBRARY_SEARCH_SYSTEM32
2560 }
2561 else if ((setDllDir = (pSetDllDir)GetProcAddress(module, "SetDllDirectoryA")) != NULL) {
2562 // SetDefaultDllDirectories() ���g�����������ASetDllDirectory() ���g����������
2563 // �J�����g�f�B���N�g���������������p�X�����������������B
2564 (*setDllDir)("");
2565 }
2566 }
2567
2568 SetupFNameW = GetDefaultSetupFNameW(NULL);
2569 SetDPIAwareness(SetupFNameW);
2570 GetUILanguageFile();
2571
2572 SetDialogFont(//L"Tahoma", 8, 0,
2573 NULL, 0, 0,
2574 UILanguageFileW, "TTMenu", "DLG_TAHOMA_FONT");
2575 checkIniFile(); //INI�t�@�C��/���W�X�g������
2576
2577 g_hI = hI;
2578
2579 if (IsWindowsNT4()){
2580 fuLoad = LR_VGACOLOR;
2581 }
2582 g_hIcon = (HICON)::LoadImage(g_hI, MAKEINTRESOURCE(TTERM_ICON), IMAGE_ICON, 32, 32, fuLoad);
2583 g_hIconSmall = (HICON)::LoadImage(g_hI, MAKEINTRESOURCE(TTERM_ICON), IMAGE_ICON, 16, 16, fuLoad);
2584
2585 memset(&winClass, 0, sizeof(winClass));
2586 winClass.style = (CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_DBLCLKS);
2587 winClass.lpfnWndProc = WinProc;
2588 winClass.cbClsExtra = 0;
2589 winClass.cbWndExtra = 0;
2590 winClass.hInstance = g_hI;
2591 winClass.hIcon = NULL;
2592 winClass.hCursor = NULL;
2593 winClass.hbrBackground = NULL;
2594 winClass.lpszMenuName = NULL;
2595 winClass.lpszClassName = TTPMENU_CLASS;
2596
2597 if (::FindWindow(TTPMENU_CLASS, NULL) == NULL) {
2598 if (::RegisterClass(&winClass) == 0) {
2599 char uimsg[MAX_UIMSG];
2600 dwErr = ::GetLastError();
2601 UTIL_get_lang_msg("MSG_ERROR_WINCLASS", uimsg, sizeof(uimsg),
2602 "Couldn't register the window class.\n", UILanguageFile);
2603 ErrorMessage(NULL, dwErr, uimsg);
2604 return FALSE;
2605 }
2606 }
2607
2608 hWnd = ::CreateWindowEx(0,
2609 TTPMENU_CLASS,
2610 "Main Window",
2611 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
2612 CW_USEDEFAULT,
2613 CW_USEDEFAULT,
2614 CW_USEDEFAULT,
2615 CW_USEDEFAULT,
2616 (HWND) NULL,
2617 (HMENU) NULL,
2618 g_hI,
2619 NULL);
2620 if (hWnd == NULL)
2621 return FALSE;
2622
2623 while (::GetMessage(&msg, NULL, 0, 0)) {
2624 ::TranslateMessage(&msg);
2625 ::DispatchMessage(&msg);
2626 }
2627
2628 free(UILanguageFileW);
2629 free(SetupFNameW);
2630 return TRUE;
2631 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26