Вам следует , а не , необходимо изменить подпись / имя библиотеки DLL, на которую вы ссылаетесь при вызове функций USER32.DLL.
Несмотря на соглашение об именах, на 64-битной машине Windows файл USER32.DLL, который находится в [Windows] \ System32, на самом деле является 64-битной DLL. реальная 32-битная версия USER32.DLL фактически находится в папке [Windows] \ SysWow64.
Пожалуйста, см. этот вопрос для дальнейшей информации.
Единственное, к чему вам, вероятно, следует быть особенно внимательным, это типы данных, которые вы передаете в качестве параметров различным функциям Windows API. Например, функция «SendMessage» в USER32.DLL имеет специальное требование, по крайней мере, с одним из ее параметров (согласно странице в P / Invoke ).
Это подпись:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
и примечания 2 и 3 ниже четко указывают:
2) НИКОГДА не используйте "int" или "integer" в качестве
LPARAM. Ваш код вылетит на 64-битной
окна. ТОЛЬКО используйте IntPtr, "ref"
структура, или структура "вне".
3) НИКОГДА не используйте "bool", "int" или
"целое число" в качестве возвращаемого значения. Ваш
ядро вылетит на 64-битных окнах.
ТОЛЬКО используйте IntPtr. Это не безопасно использовать
bool - pInvoke не может вывести
IntPtr для логического значения.
Это "предостережение", по-видимому, специфично для этой конкретной функции (SendMessage), хотя я бы обратил особое внимание на это при вызове любых функций Windows API.