Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / поясните по исходнику / 12 сообщений из 12, страница 1 из 1
15.10.2014, 10:20
    #38776961
crause
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
как то давно нашел утилиту по замене курсора при вводе вроде как полезная штука местами.
решил пару утилит аналогичных сделать, естественно на delphi.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
#define OEMRESOURCE
#include <windows.h>

HINSTANCE	g_instance;
HHOOK		g_hook;
HCURSOR		g_hc_ibeam;
UINT_PTR	g_timer = NULL;
DWORD		g_active = 0;
DWORD		g_layout = 0;

void CALLBACK UpdateTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
	if (g_active < GetTickCount())
	{
		KillTimer(0, g_timer);
		g_timer = NULL;
		g_active = 0;
		g_layout = 0;
		SetSystemCursor(CopyCursor(g_hc_ibeam), OCR_IBEAM);
	}
	else
	{
		int layout = (int) GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)) & 0xFFFF;
		if (g_layout != layout)
		{
			g_layout = layout;
			HCURSOR hc_new = LoadCursor(g_instance, MAKEINTRESOURCE(layout));
			if (hc_new)
			{
				SetSystemCursor(hc_new, OCR_IBEAM);
			}
			else
			{
				SetSystemCursor(CopyCursor(g_hc_ibeam), OCR_IBEAM);
			}
		}
	}
}

LRESULT CALLBACK LowLevelKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;
		if (ks->vkCode==VK_LSHIFT)
		{
			if (wParam == WM_KEYDOWN)
			{
				g_active = GetTickCount() + 10000;
				UpdateTimer(NULL, NULL, NULL, NULL);
				g_timer = SetTimer(NULL, g_timer, 100, UpdateTimer);
			}
			else if (wParam == WM_KEYUP && g_active)
			{
				g_active = GetTickCount() + 1000;
			}
		}
	}
	return CallNextHookEx(g_hook, nCode, wParam, lParam);
}

int Main()
{
	HANDLE mutex = CreateMutex(NULL, FALSE, "LangCursor");
	if (GetLastError() == ERROR_ALREADY_EXISTS || GetLastError() == ERROR_ACCESS_DENIED) return 1;

	g_hc_ibeam = CopyCursor(LoadCursor(NULL, IDC_IBEAM));
	if (!g_hc_ibeam) return 1;

	g_instance = GetModuleHandle(NULL);
	g_hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardHook, g_instance, 0);
	if (!g_hook) return 1;

	MSG msg;
	while (GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	UnhookWindowsHookEx(g_hook);
	DestroyCursor(g_hc_ibeam);
	return 0;
}

EXTERN_C void WINAPI WinMainCRTStartup()
{
	ExitProcess(Main());





- Зачем автору в исходнике mutex?
- приложение не оконное зачем тут GetMessage.... в цикле?
...
Рейтинг: 0 / 0
15.10.2014, 10:29
    #38776978
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
crause
Код: sql
1.
2.
3.
4.
5.
HCURSOR hc_new = LoadCursor(g_instance, MAKEINTRESOURCE(layout));
if (hc_new)
{
   SetSystemCursor(hc_new, OCR_IBEAM);
}


Ещё вопрос: что это за фигня, если в MSDN написано "The system destroys hcur by calling
the DestroyCursor function. Therefore, hcur cannot be a cursor loaded using the LoadCursor
function."?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.10.2014, 10:33
    #38776986
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
crause- Зачем автору в исходнике mutex?
Для зашиты от одновременного запуска нескольких копий. Первая копия создает именованный мутекс, вторая получает ошибку ERROR_ALREADY_EXISTS и завершается.
...
Рейтинг: 0 / 0
15.10.2014, 10:36
    #38776990
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
crause- приложение не оконное зачем тут GetMessage.... в цикле?

Отвечу сразу на второй вопрос -- GetMessage тут нужно именно потому, что приложение оконное.
Собственно, оконность приложения тем и определяется, что оно использует GetMessage.
...
Рейтинг: 0 / 0
15.10.2014, 10:40
    #38776999
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
crause
- Зачем автору в исходнике mutex?


Чтобы контролировать запуск приложения и гарантированно иметь только один экземпляр приложения.
Т.е. повторный запуск приложения запрещается, как только выявляется, что приложение уже запущено, оно тут же завершается.
Делается это с помощью мьютекса , но это могло бы быть сделано на основе любого другого глобального объекта ядра (kernel) или GDI, на тех же принципах.
...
Рейтинг: 0 / 0
15.10.2014, 10:43
    #38777006
crause
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
C C++ незнаком и сейчас читаю его очень тяжело, но хотя не страшен черт так как он кажется.
Спасибо разобрался в коде вопросов стало намного меньше.
...
Рейтинг: 0 / 0
15.10.2014, 10:46
    #38777011
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
crause- приложение не оконное зачем тут GetMessage.... в цикле?

Тут конкретно это нужно, чтобы работал таймер и
вызывалась функция
UpdateTimer
...
Рейтинг: 0 / 0
15.10.2014, 10:48
    #38777015
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
crause,

это очевидно не самый лучший в мире код Windows-приложения...
Можно встречный вопрос -- зачем эта хрень нужна и что она делает?
...
Рейтинг: 0 / 0
15.10.2014, 10:49
    #38777018
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
crauseC C++ незнаком и сейчас читаю его очень тяжело...
Тут от Си разве что фигурные скобки :) остальное это WinAPI. Оно и в дельфях практически так же будет выглядеть.
...
Рейтинг: 0 / 0
15.10.2014, 10:56
    #38777028
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
crauseC C++ незнаком и сейчас читаю его очень тяжело, но хотя не страшен черт так как он кажется.
Спасибо разобрался в коде вопросов стало намного меньше.

Этот код на чистом С, это не С++...
...
Рейтинг: 0 / 0
15.10.2014, 11:12
    #38777050
crause
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
приложение висит и при переключении языка и изменении курсора на Input меняет курсор на свой курсор-Input c языковыми метками.

Для меня что С# что Си что С++ все на один вид, различий не вижу.

А что в этом коде не так? Почему он не самый лучший?
...
Рейтинг: 0 / 0
15.10.2014, 13:29
    #38777291
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поясните по исходнику
Ну, например, потому что это оконное приложение, а используется точка входа от консольного.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / поясните по исходнику / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]