deep-wine-runner/key/sendkeys.sh
2022-10-07 21:42:03 +08:00

108 lines
2.5 KiB
Bash
Executable File

#!/bin/bash
# $1 key value
# $2 process name , default QQ|TIM
# $3 control mode , default ctrl+alt
# 0 no control key
# 1 shift+
# 2 ctrl+
# 3 alt+
# 4 ctrl+alt+
# 5 ctrl+shift+
# 6 alt+shift+
SHELL_DIR=$(dirname $0)
SHELL_DIR=$(realpath "$SHELL_DIR")
if [ $SPECIFY_SHELL_DIR ]; then
SHELL_DIR=$SPECIFY_SHELL_DIR
fi
get_wine_by_pid()
{
cat /proc/$1/maps | grep -E "\/wine$|\/wine64$|\/wine |\/wine64 " | head -1 | awk '{print $6}'
}
is_wine_process()
{
wine_module=$(get_wine_by_pid $1)
if [ -z "$wine_module" ];then
wine_module=$(cat /proc/$1/maps | grep -E "\/wineserver$" | head -1)
fi
echo $wine_module
}
get_prefix_by_pid()
{
WINE_PREFIX=$(xargs -0 printf '%s\n' < /proc/$1/environ | grep WINEPREFIX)
WINE_PREFIX=${WINE_PREFIX##*=}
if [ -z "$WINE_PREFIX" ] && [ -n "$(is_wine_process $1)" ]; then
#不指定容器的情况用默认容器目录
WINE_PREFIX="$HOME/.wine"
fi
WINE_PREFIX=$(realpath $WINE_PREFIX)
echo $WINE_PREFIX
}
get_bottle_path_by_process_id()
{
PID_LIST="$1"
PREFIX_LIST=""
for pid_var in $PID_LIST ; do
WINE_PREFIX=$(get_prefix_by_pid $pid_var)
for path in $(echo -e $PREFIX_LIST) ; do
prefix=${path#*=}
if [ "$prefix" == "$WINE_PREFIX" ]; then
WINE_PREFIX=""
fi
done
if [ -n "$WINE_PREFIX" ];then
PREFIX_LIST+="\n$pid_var=$WINE_PREFIX"
fi
done
echo -e $PREFIX_LIST
}
get_bottle_path_by_process_name()
{
PID_LIST=""
for pid_var in $(ps -ef | grep -E -i "$1" | grep -v grep | awk '{print $2}');do
#通过判断是否加载wine来判断是不是wine进程
if [ -n "$(is_wine_process $pid_var)" ];then
PID_LIST+=" $pid_var"
fi
done
get_bottle_path_by_process_id "$PID_LIST"
}
send_to_process()
{
if [ -z "$2" ]; then
return 0
fi
for path in $(get_bottle_path_by_process_name $2); do
proc_pid=${path%=*}
prefix=${path#*=}
wine_cmd=$(get_wine_by_pid $proc_pid)
wine_name=$(echo $wine_cmd | awk -F / '{print $(NF-2)}')
if command -v $wine_name > /dev/null 2>&1; then
wine_cmd="$wine_name"
fi
echo "send to $path by $wine_cmd"
env WINEPREFIX="$prefix" "$wine_cmd" "$SHELL_DIR/sendkeys.exe" $1 $3
done
}
if [ -z "$1" ]; then
echo "Please input a key [a-zA-Z]"
exit 0
fi
if [ -n "$2" ]; then
send_to_process $1 $2 $3
else
send_to_process $1 "QQ|TIM"
fi